{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "yfv52r2G33jY"
   },
   "source": [
    "<a target=\"_blank\" href=\"https://colab.research.google.com/github/AI4Finance-Foundation/FinRL-Tutorials/blob/master/1-Introduction/Stock_NeurIPS2018_SB3.py\">\n",
    "  <img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/>\n",
    "</a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gXaoZs2lh1hi"
   },
   "source": [
    "# Deep Reinforcement Learning for Stock Trading from Scratch: Multiple Stock Trading\n",
    "\n",
    "* **Pytorch Version** \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "lGunVt8oLCVS"
   },
   "source": [
    "# Content"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HOzAKQ-SLGX6"
   },
   "source": [
    "* [1. Task Description](#0)\n",
    "* [2. Install Python packages](#1)\n",
    "    * [2.1. Install Packages](#1.1)    \n",
    "    * [2.2. A List of Python Packages](#1.2)\n",
    "    * [2.3. Import Packages](#1.3)\n",
    "    * [2.4. Create Folders](#1.4)\n",
    "* [3. Download and Preprocess Data](#2)\n",
    "* [4. Preprocess Data](#3)        \n",
    "    * [4.1. Technical Indicators](#3.1)\n",
    "    * [4.2. Perform Feature Engineering](#3.2)\n",
    "* [5. Build Market Environment in OpenAI Gym-style](#4)  \n",
    "    * [5.1. Data Split](#4.1)  \n",
    "    * [5.3. Environment for Training](#4.2)    \n",
    "* [6. Train DRL Agents](#5)\n",
    "* [7. Backtesting Performance](#6)  \n",
    "    * [7.1. BackTestStats](#6.1)\n",
    "    * [7.2. BackTestPlot](#6.2)   \n",
    "  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "sApkDlD9LIZv"
   },
   "source": [
    "<a id='0'></a>\n",
    "# Part 1. Task Discription"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HjLD2TZSLKZ-"
   },
   "source": [
    "We train a DRL agent for stock trading. This task is modeled as a Markov Decision Process (MDP), and the objective function is maximizing (expected) cumulative return.\n",
    "\n",
    "We specify the state-action-reward as follows:\n",
    "\n",
    "* **State s**: The state space represents an agent's perception of the market environment. Just like a human trader analyzing various information, here our agent passively observes many features and learns by interacting with the market environment (usually by replaying historical data).\n",
    "\n",
    "* **Action a**: The action space includes allowed actions that an agent can take at each state. For example, a ∈ {−1, 0, 1}, where −1, 0, 1 represent\n",
    "selling, holding, and buying. When an action operates multiple shares, a ∈{−k, ..., −1, 0, 1, ..., k}, e.g.. \"Buy\n",
    "10 shares of AAPL\" or \"Sell 10 shares of AAPL\" are 10 or −10, respectively\n",
    "\n",
    "* **Reward function r(s, a, s′)**: Reward is an incentive for an agent to learn a better policy. For example, it can be the change of the portfolio value when taking a at state s and arriving at new state s',  i.e., r(s, a, s′) = v′ − v, where v′ and v represent the portfolio values at state s′ and s, respectively\n",
    "\n",
    "\n",
    "**Market environment**: 30 consituent stocks of Dow Jones Industrial Average (DJIA) index. Accessed at the starting date of the testing period.\n",
    "\n",
    "\n",
    "The data for this case study is obtained from Yahoo Finance API. The data contains Open-High-Low-Close price and volume.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Ffsre789LY08"
   },
   "source": [
    "<a id='1'></a>\n",
    "# Part 2. Install Python Packages"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Uy5_PTmOh1hj"
   },
   "source": [
    "<a id='1.1'></a>\n",
    "## 2.1. Install packages\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "mPT0ipYE28wL",
    "outputId": "ae04aff7-94ea-473e-9bc1-d26f56ac3426"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
      "Collecting swig\n",
      "  Downloading swig-4.1.1-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.8 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m19.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hInstalling collected packages: swig\n",
      "Successfully installed swig-4.1.1\n",
      "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
      "Collecting wrds\n",
      "  Downloading wrds-3.1.6-py3-none-any.whl (12 kB)\n",
      "Requirement already satisfied: numpy in /usr/local/lib/python3.9/dist-packages (from wrds) (1.22.4)\n",
      "Collecting psycopg2-binary\n",
      "  Downloading psycopg2_binary-2.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.0/3.0 MB\u001b[0m \u001b[31m27.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: sqlalchemy<2 in /usr/local/lib/python3.9/dist-packages (from wrds) (1.4.46)\n",
      "Requirement already satisfied: scipy in /usr/local/lib/python3.9/dist-packages (from wrds) (1.10.1)\n",
      "Requirement already satisfied: pandas in /usr/local/lib/python3.9/dist-packages (from wrds) (1.3.5)\n",
      "Requirement already satisfied: greenlet!=0.4.17 in /usr/local/lib/python3.9/dist-packages (from sqlalchemy<2->wrds) (2.0.2)\n",
      "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.9/dist-packages (from pandas->wrds) (2022.7.1)\n",
      "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.9/dist-packages (from pandas->wrds) (2.8.2)\n",
      "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.9/dist-packages (from python-dateutil>=2.7.3->pandas->wrds) (1.15.0)\n",
      "Installing collected packages: psycopg2-binary, wrds\n",
      "Successfully installed psycopg2-binary-2.9.5 wrds-3.1.6\n",
      "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
      "Collecting pyportfolioopt\n",
      "  Downloading pyportfolioopt-1.5.4-py3-none-any.whl (61 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.9/61.9 KB\u001b[0m \u001b[31m2.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: pandas>=0.19 in /usr/local/lib/python3.9/dist-packages (from pyportfolioopt) (1.3.5)\n",
      "Requirement already satisfied: scipy<2.0,>=1.3 in /usr/local/lib/python3.9/dist-packages (from pyportfolioopt) (1.10.1)\n",
      "Requirement already satisfied: numpy<2.0.0,>=1.22.4 in /usr/local/lib/python3.9/dist-packages (from pyportfolioopt) (1.22.4)\n",
      "Requirement already satisfied: cvxpy<2.0.0,>=1.1.10 in /usr/local/lib/python3.9/dist-packages (from pyportfolioopt) (1.2.3)\n",
      "Requirement already satisfied: osqp>=0.4.1 in /usr/local/lib/python3.9/dist-packages (from cvxpy<2.0.0,>=1.1.10->pyportfolioopt) (0.6.2.post0)\n",
      "Requirement already satisfied: setuptools<=64.0.2 in /usr/local/lib/python3.9/dist-packages (from cvxpy<2.0.0,>=1.1.10->pyportfolioopt) (57.4.0)\n",
      "Requirement already satisfied: scs>=1.1.6 in /usr/local/lib/python3.9/dist-packages (from cvxpy<2.0.0,>=1.1.10->pyportfolioopt) (3.2.2)\n",
      "Requirement already satisfied: ecos>=2 in /usr/local/lib/python3.9/dist-packages (from cvxpy<2.0.0,>=1.1.10->pyportfolioopt) (2.0.12)\n",
      "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.9/dist-packages (from pandas>=0.19->pyportfolioopt) (2.8.2)\n",
      "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.9/dist-packages (from pandas>=0.19->pyportfolioopt) (2022.7.1)\n",
      "Requirement already satisfied: qdldl in /usr/local/lib/python3.9/dist-packages (from osqp>=0.4.1->cvxpy<2.0.0,>=1.1.10->pyportfolioopt) (0.1.5.post3)\n",
      "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.9/dist-packages (from python-dateutil>=2.7.3->pandas>=0.19->pyportfolioopt) (1.15.0)\n",
      "Installing collected packages: pyportfolioopt\n",
      "Successfully installed pyportfolioopt-1.5.4\n",
      "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
      "Collecting git+https://github.com/AI4Finance-Foundation/FinRL.git\n",
      "  Cloning https://github.com/AI4Finance-Foundation/FinRL.git to /tmp/pip-req-build-hnlupdsm\n",
      "  Running command git clone --filter=blob:none --quiet https://github.com/AI4Finance-Foundation/FinRL.git /tmp/pip-req-build-hnlupdsm\n",
      "  Resolved https://github.com/AI4Finance-Foundation/FinRL.git to commit 4028be5daf1080300e3f8373427f197b248bed35\n",
      "  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "Collecting elegantrl@ git+https://github.com/AI4Finance-Foundation/ElegantRL.git#egg=elegantrl\n",
      "  Cloning https://github.com/AI4Finance-Foundation/ElegantRL.git to /tmp/pip-install-h67e5a0c/elegantrl_30347ace2a1e4c84ba0a208f84303f29\n",
      "  Running command git clone --filter=blob:none --quiet https://github.com/AI4Finance-Foundation/ElegantRL.git /tmp/pip-install-h67e5a0c/elegantrl_30347ace2a1e4c84ba0a208f84303f29\n",
      "  Resolved https://github.com/AI4Finance-Foundation/ElegantRL.git to commit 68bf0ea4ef3fb461026ece8897deabb92aeead32\n",
      "  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Collecting pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2\n",
      "  Cloning https://github.com/quantopian/pyfolio.git to /tmp/pip-install-h67e5a0c/pyfolio_5ce1ff98319a4f278eb49cd7d1392f84\n",
      "  Running command git clone --filter=blob:none --quiet https://github.com/quantopian/pyfolio.git /tmp/pip-install-h67e5a0c/pyfolio_5ce1ff98319a4f278eb49cd7d1392f84\n",
      "  Resolved https://github.com/quantopian/pyfolio.git to commit 4b901f6d73aa02ceb6d04b7d83502e5c6f2e81aa\n",
      "  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Collecting jqdatasdk\n",
      "  Downloading jqdatasdk-1.8.11-py3-none-any.whl (158 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m158.2/158.2 KB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: gym>=0.17 in /usr/local/lib/python3.9/dist-packages (from finrl==0.3.5) (0.25.2)\n",
      "Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.9/dist-packages (from finrl==0.3.5) (1.22.4)\n",
      "Collecting stockstats>=0.4.0\n",
      "  Downloading stockstats-0.5.2-py2.py3-none-any.whl (20 kB)\n",
      "Requirement already satisfied: scikit-learn>=0.21.0 in /usr/local/lib/python3.9/dist-packages (from finrl==0.3.5) (1.2.1)\n",
      "Collecting stable-baselines3<2.0.0,>=1.6.2\n",
      "  Downloading stable_baselines3-1.7.0-py3-none-any.whl (171 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m171.8/171.8 KB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting alpaca_trade_api>=2.1.0\n",
      "  Downloading alpaca_trade_api-3.0.0-py3-none-any.whl (33 kB)\n",
      "Collecting tensorboardX\n",
      "  Downloading tensorboardX-2.6-py2.py3-none-any.whl (114 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.5/114.5 KB\u001b[0m \u001b[31m12.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting ray[default,tune]>=2.0.0\n",
      "  Downloading ray-2.3.0-cp39-cp39-manylinux2014_x86_64.whl (58.6 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.6/58.6 MB\u001b[0m \u001b[31m9.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting yfinance\n",
      "  Downloading yfinance-0.2.12-py2.py3-none-any.whl (59 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m59.2/59.2 KB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.9/dist-packages (from finrl==0.3.5) (3.5.3)\n",
      "Collecting importlib-metadata==4.13.0\n",
      "  Downloading importlib_metadata-4.13.0-py3-none-any.whl (23 kB)\n",
      "Collecting pandas_market_calendars==3.6.3\n",
      "  Downloading pandas_market_calendars-3.6.3.tar.gz (152 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.8/152.8 KB\u001b[0m \u001b[31m18.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Collecting gputil\n",
      "  Downloading GPUtil-1.4.0.tar.gz (5.5 kB)\n",
      "  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Collecting lz4\n",
      "  Downloading lz4-4.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m57.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: pandas>=1.1.5 in /usr/local/lib/python3.9/dist-packages (from finrl==0.3.5) (1.3.5)\n",
      "Collecting ccxt>=1.66.32\n",
      "  Downloading ccxt-2.9.11-py2.py3-none-any.whl (3.5 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.5/3.5 MB\u001b[0m \u001b[31m85.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pyluach\n",
      "  Downloading pyluach-2.2.0-py3-none-any.whl (25 kB)\n",
      "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.9/dist-packages (from pandas_market_calendars==3.6.3->finrl==0.3.5) (2.8.2)\n",
      "Requirement already satisfied: pytz in /usr/local/lib/python3.9/dist-packages (from pandas_market_calendars==3.6.3->finrl==0.3.5) (2022.7.1)\n",
      "Requirement already satisfied: toolz in /usr/local/lib/python3.9/dist-packages (from pandas_market_calendars==3.6.3->finrl==0.3.5) (0.12.0)\n",
      "Requirement already satisfied: korean_lunar_calendar in /usr/local/lib/python3.9/dist-packages (from pandas_market_calendars==3.6.3->finrl==0.3.5) (0.3.1)\n",
      "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.9/dist-packages (from importlib-metadata==4.13.0->finrl==0.3.5) (3.15.0)\n",
      "Requirement already satisfied: PyYAML==6.0 in /usr/local/lib/python3.9/dist-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (6.0)\n",
      "Requirement already satisfied: requests<3,>2 in /usr/local/lib/python3.9/dist-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (2.25.1)\n",
      "Collecting deprecation==2.1.0\n",
      "  Downloading deprecation-2.1.0-py2.py3-none-any.whl (11 kB)\n",
      "Collecting msgpack==1.0.3\n",
      "  Downloading msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (322 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m322.2/322.2 KB\u001b[0m \u001b[31m30.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: urllib3<2,>1.24 in /usr/local/lib/python3.9/dist-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (1.26.14)\n",
      "Collecting aiohttp==3.8.1\n",
      "  Downloading aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.2 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.2/1.2 MB\u001b[0m \u001b[31m61.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting websocket-client<2,>=0.56.0\n",
      "  Downloading websocket_client-1.5.1-py3-none-any.whl (55 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m55.9/55.9 KB\u001b[0m \u001b[31m7.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting websockets<11,>=9.0\n",
      "  Downloading websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (106 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m106.5/106.5 KB\u001b[0m \u001b[31m12.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting yarl<2.0,>=1.0\n",
      "  Downloading yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (264 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m264.6/264.6 KB\u001b[0m \u001b[31m28.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting multidict<7.0,>=4.5\n",
      "  Downloading multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.2/114.2 KB\u001b[0m \u001b[31m11.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting async-timeout<5.0,>=4.0.0a3\n",
      "  Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n",
      "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.9/dist-packages (from aiohttp==3.8.1->alpaca_trade_api>=2.1.0->finrl==0.3.5) (22.2.0)\n",
      "Collecting charset-normalizer<3.0,>=2.0\n",
      "  Downloading charset_normalizer-2.1.1-py3-none-any.whl (39 kB)\n",
      "Collecting aiosignal>=1.1.2\n",
      "  Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n",
      "Collecting frozenlist>=1.1.1\n",
      "  Downloading frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (158 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m158.8/158.8 KB\u001b[0m \u001b[31m17.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.9/dist-packages (from deprecation==2.1.0->alpaca_trade_api>=2.1.0->finrl==0.3.5) (23.0)\n",
      "Requirement already satisfied: certifi>=2018.1.18 in /usr/local/lib/python3.9/dist-packages (from ccxt>=1.66.32->finrl==0.3.5) (2022.12.7)\n",
      "Collecting aiodns>=1.1.1\n",
      "  Downloading aiodns-3.0.0-py3-none-any.whl (5.0 kB)\n",
      "Collecting cryptography>=2.6.1\n",
      "  Downloading cryptography-39.0.2-cp36-abi3-manylinux_2_28_x86_64.whl (4.2 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.2/4.2 MB\u001b[0m \u001b[31m70.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting setuptools>=60.9.0\n",
      "  Downloading setuptools-67.6.0-py3-none-any.whl (1.1 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m49.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: gym-notices>=0.0.4 in /usr/local/lib/python3.9/dist-packages (from gym>=0.17->finrl==0.3.5) (0.0.8)\n",
      "Requirement already satisfied: cloudpickle>=1.2.0 in /usr/local/lib/python3.9/dist-packages (from gym>=0.17->finrl==0.3.5) (2.2.1)\n",
      "Requirement already satisfied: protobuf!=3.19.5,>=3.15.3 in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (3.19.6)\n",
      "Requirement already satisfied: grpcio>=1.32.0 in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (1.51.3)\n",
      "Collecting virtualenv>=20.0.24\n",
      "  Downloading virtualenv-20.20.0-py3-none-any.whl (8.7 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.7/8.7 MB\u001b[0m \u001b[31m56.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: jsonschema in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (4.3.3)\n",
      "Requirement already satisfied: filelock in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (3.9.0)\n",
      "Requirement already satisfied: click>=7.0 in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (8.1.3)\n",
      "Collecting colorful\n",
      "  Downloading colorful-0.5.5-py2.py3-none-any.whl (201 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m201.4/201.4 KB\u001b[0m \u001b[31m18.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting py-spy>=0.2.0\n",
      "  Downloading py_spy-0.3.14-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl (3.0 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.0/3.0 MB\u001b[0m \u001b[31m64.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: pydantic in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (1.10.5)\n",
      "Collecting gpustat>=1.0.0\n",
      "  Downloading gpustat-1.0.0.tar.gz (90 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m90.5/90.5 KB\u001b[0m \u001b[31m9.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Requirement already satisfied: prometheus-client>=0.7.1 in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (0.16.0)\n",
      "Collecting opencensus\n",
      "  Downloading opencensus-0.11.2-py2.py3-none-any.whl (128 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m128.2/128.2 KB\u001b[0m \u001b[31m13.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: smart-open in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (6.3.0)\n",
      "Collecting aiohttp-cors\n",
      "  Downloading aiohttp_cors-0.7.0-py3-none-any.whl (27 kB)\n",
      "Requirement already satisfied: tabulate in /usr/local/lib/python3.9/dist-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (0.8.10)\n",
      "Requirement already satisfied: scipy>=1.3.2 in /usr/local/lib/python3.9/dist-packages (from scikit-learn>=0.21.0->finrl==0.3.5) (1.10.1)\n",
      "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.9/dist-packages (from scikit-learn>=0.21.0->finrl==0.3.5) (1.2.0)\n",
      "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.9/dist-packages (from scikit-learn>=0.21.0->finrl==0.3.5) (3.1.0)\n",
      "Requirement already satisfied: torch>=1.11 in /usr/local/lib/python3.9/dist-packages (from stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (1.13.1+cu116)\n",
      "Collecting gym>=0.17\n",
      "  Downloading gym-0.21.0.tar.gz (1.5 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m67.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Requirement already satisfied: six in /usr/local/lib/python3.9/dist-packages (from jqdatasdk->finrl==0.3.5) (1.15.0)\n",
      "Collecting pymysql>=0.7.6\n",
      "  Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m43.8/43.8 KB\u001b[0m \u001b[31m3.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: SQLAlchemy>=1.2.8 in /usr/local/lib/python3.9/dist-packages (from jqdatasdk->finrl==0.3.5) (1.4.46)\n",
      "Collecting thriftpy2>=0.3.9\n",
      "  Downloading thriftpy2-0.4.16.tar.gz (643 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m643.4/643.4 KB\u001b[0m \u001b[31m37.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Requirement already satisfied: pyparsing>=2.2.1 in /usr/local/lib/python3.9/dist-packages (from matplotlib->finrl==0.3.5) (3.0.9)\n",
      "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.9/dist-packages (from matplotlib->finrl==0.3.5) (1.4.4)\n",
      "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.9/dist-packages (from matplotlib->finrl==0.3.5) (8.4.0)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.9/dist-packages (from matplotlib->finrl==0.3.5) (4.39.0)\n",
      "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.9/dist-packages (from matplotlib->finrl==0.3.5) (0.11.0)\n",
      "Requirement already satisfied: ipython>=3.2.3 in /usr/local/lib/python3.9/dist-packages (from pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (7.9.0)\n",
      "Requirement already satisfied: seaborn>=0.7.1 in /usr/local/lib/python3.9/dist-packages (from pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.11.2)\n",
      "Collecting empyrical>=0.5.0\n",
      "  Downloading empyrical-0.5.5.tar.gz (52 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m52.8/52.8 KB\u001b[0m \u001b[31m5.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Requirement already satisfied: lxml>=4.9.1 in /usr/local/lib/python3.9/dist-packages (from yfinance->finrl==0.3.5) (4.9.2)\n",
      "Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.9/dist-packages (from yfinance->finrl==0.3.5) (0.0.11)\n",
      "Collecting appdirs>=1.4.4\n",
      "  Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)\n",
      "Collecting beautifulsoup4>=4.11.1\n",
      "  Downloading beautifulsoup4-4.11.2-py3-none-any.whl (129 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m129.4/129.4 KB\u001b[0m \u001b[31m15.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting frozendict>=2.3.4\n",
      "  Downloading frozendict-2.3.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (112 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m112.8/112.8 KB\u001b[0m \u001b[31m12.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting requests<3,>2\n",
      "  Downloading requests-2.28.2-py3-none-any.whl (62 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.8/62.8 KB\u001b[0m \u001b[31m6.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting html5lib>=1.1\n",
      "  Downloading html5lib-1.1-py2.py3-none-any.whl (112 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m112.2/112.2 KB\u001b[0m \u001b[31m11.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pycares>=4.0.0\n",
      "  Downloading pycares-4.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (288 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m288.7/288.7 KB\u001b[0m \u001b[31m27.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting soupsieve>1.2\n",
      "  Downloading soupsieve-2.4-py3-none-any.whl (37 kB)\n",
      "Requirement already satisfied: cffi>=1.12 in /usr/local/lib/python3.9/dist-packages (from cryptography>=2.6.1->ccxt>=1.66.32->finrl==0.3.5) (1.15.1)\n",
      "Requirement already satisfied: pandas-datareader>=0.2 in /usr/local/lib/python3.9/dist-packages (from empyrical>=0.5.0->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.9.0)\n",
      "Collecting nvidia-ml-py<=11.495.46,>=11.450.129\n",
      "  Downloading nvidia_ml_py-11.495.46-py3-none-any.whl (25 kB)\n",
      "Collecting psutil>=5.6.0\n",
      "  Downloading psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (280 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m280.2/280.2 KB\u001b[0m \u001b[31m24.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting blessed>=1.17.1\n",
      "  Downloading blessed-1.20.0-py2.py3-none-any.whl (58 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.4/58.4 KB\u001b[0m \u001b[31m6.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: webencodings in /usr/local/lib/python3.9/dist-packages (from html5lib>=1.1->yfinance->finrl==0.3.5) (0.5.1)\n",
      "Requirement already satisfied: backcall in /usr/local/lib/python3.9/dist-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.2.0)\n",
      "Requirement already satisfied: pygments in /usr/local/lib/python3.9/dist-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (2.6.1)\n",
      "Requirement already satisfied: pexpect in /usr/local/lib/python3.9/dist-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (4.8.0)\n",
      "Requirement already satisfied: traitlets>=4.2 in /usr/local/lib/python3.9/dist-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (5.7.1)\n",
      "Requirement already satisfied: decorator in /usr/local/lib/python3.9/dist-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (4.4.2)\n",
      "Requirement already satisfied: prompt-toolkit<2.1.0,>=2.0.0 in /usr/local/lib/python3.9/dist-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (2.0.10)\n",
      "Collecting jedi>=0.10\n",
      "  Downloading jedi-0.18.2-py2.py3-none-any.whl (1.6 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m52.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: pickleshare in /usr/local/lib/python3.9/dist-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.7.5)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.9/dist-packages (from requests<3,>2->alpaca_trade_api>=2.1.0->finrl==0.3.5) (2.10)\n",
      "Requirement already satisfied: greenlet!=0.4.17 in /usr/local/lib/python3.9/dist-packages (from SQLAlchemy>=1.2.8->jqdatasdk->finrl==0.3.5) (2.0.2)\n",
      "Collecting ply<4.0,>=3.4\n",
      "  Downloading ply-3.11-py2.py3-none-any.whl (49 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.6/49.6 KB\u001b[0m \u001b[31m5.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: typing-extensions in /usr/local/lib/python3.9/dist-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (4.5.0)\n",
      "Collecting distlib<1,>=0.3.6\n",
      "  Downloading distlib-0.3.6-py2.py3-none-any.whl (468 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m468.5/468.5 KB\u001b[0m \u001b[31m34.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: platformdirs<4,>=2.4 in /usr/local/lib/python3.9/dist-packages (from virtualenv>=20.0.24->ray[default,tune]>=2.0.0->finrl==0.3.5) (3.1.0)\n",
      "Collecting gym[box2d]\n",
      "  Downloading gym-0.26.2.tar.gz (721 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m721.7/721.7 KB\u001b[0m \u001b[31m43.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.26.1.tar.gz (719 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m719.9/719.9 KB\u001b[0m \u001b[31m46.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.26.0.tar.gz (710 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m710.3/710.3 KB\u001b[0m \u001b[31m36.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.25.1.tar.gz (732 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m732.2/732.2 KB\u001b[0m \u001b[31m52.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.25.0.tar.gz (720 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m720.4/720.4 KB\u001b[0m \u001b[31m36.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.24.1.tar.gz (696 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m696.4/696.4 KB\u001b[0m \u001b[31m35.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.24.0.tar.gz (694 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m694.4/694.4 KB\u001b[0m \u001b[31m47.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.23.1.tar.gz (626 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m626.2/626.2 KB\u001b[0m \u001b[31m39.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.23.0.tar.gz (624 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m624.4/624.4 KB\u001b[0m \u001b[31m37.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Downloading gym-0.22.0.tar.gz (631 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m631.1/631.1 KB\u001b[0m \u001b[31m33.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
      "  Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
      "  Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "\u001b[33mWARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))': /simple/box2d-py/\u001b[0m\u001b[33m\n",
      "\u001b[0mCollecting box2d-py==2.3.5\n",
      "\u001b[33m  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))': /packages/dd/5a/ad8d3ef9c13d5afcc1e44a77f11792ee717f6727b3320bddbc607e935e2a/box2d-py-2.3.5.tar.gz\u001b[0m\u001b[33m\n",
      "\u001b[0m  Downloading box2d-py-2.3.5.tar.gz (374 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m374.4/374.4 KB\u001b[0m \u001b[31m7.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "Collecting pyglet>=1.4.0\n",
      "  Downloading pyglet-2.0.5-py3-none-any.whl (831 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m831.3/831.3 KB\u001b[0m \u001b[31m35.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/lib/python3.9/dist-packages (from jsonschema->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.19.3)\n",
      "Collecting opencensus-context>=0.1.3\n",
      "  Downloading opencensus_context-0.1.3-py2.py3-none-any.whl (5.1 kB)\n",
      "Requirement already satisfied: google-api-core<3.0.0,>=1.0.0 in /usr/local/lib/python3.9/dist-packages (from opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (2.11.0)\n",
      "Requirement already satisfied: wcwidth>=0.1.4 in /usr/local/lib/python3.9/dist-packages (from blessed>=1.17.1->gpustat>=1.0.0->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.2.6)\n",
      "Requirement already satisfied: pycparser in /usr/local/lib/python3.9/dist-packages (from cffi>=1.12->cryptography>=2.6.1->ccxt>=1.66.32->finrl==0.3.5) (2.21)\n",
      "Requirement already satisfied: googleapis-common-protos<2.0dev,>=1.56.2 in /usr/local/lib/python3.9/dist-packages (from google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (1.58.0)\n",
      "Requirement already satisfied: google-auth<3.0dev,>=2.14.1 in /usr/local/lib/python3.9/dist-packages (from google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (2.16.2)\n",
      "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /usr/local/lib/python3.9/dist-packages (from jedi>=0.10->ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.8.3)\n",
      "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.9/dist-packages (from pexpect->ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.7.0)\n",
      "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.9/dist-packages (from google-auth<3.0dev,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (5.3.0)\n",
      "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.9/dist-packages (from google-auth<3.0dev,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.2.8)\n",
      "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.9/dist-packages (from google-auth<3.0dev,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (4.9)\n",
      "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.9/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3.0dev,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.4.8)\n",
      "Building wheels for collected packages: finrl, pandas_market_calendars, gym, elegantrl, gputil, pyfolio, empyrical, gpustat, thriftpy2, box2d-py\n",
      "  Building wheel for finrl (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for finrl: filename=finrl-0.3.5-py3-none-any.whl size=2860819 sha256=3dadd5b9398c485ce96cb11ac2cbcfa4d5301d42e680a0f38bb1da988f7106cc\n",
      "  Stored in directory: /tmp/pip-ephem-wheel-cache-nzt2g0py/wheels/ec/6a/08/c43694890a7c5a62c23af4b2a497bce5ee7edef607852cf53f\n",
      "  Building wheel for pandas_market_calendars (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for pandas_market_calendars: filename=pandas_market_calendars-3.6.3-py3-none-any.whl size=182636 sha256=4c654489b079f990d82b39b6c8bb8cecee3893291427a9773bc20e9653313e17\n",
      "  Stored in directory: /root/.cache/pip/wheels/4e/02/f9/6c6eeb48a242879e357caf2813953fa8b6e26bd0110bd94226\n",
      "  Building wheel for gym (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for gym: filename=gym-0.21.0-py3-none-any.whl size=1616821 sha256=da670b1fe81556d628bb3de6000c176261c781d8f732097c4b8bbe964c7d005a\n",
      "  Stored in directory: /root/.cache/pip/wheels/b3/50/6c/0a82c1358b4da2dbd9c1bb17e0f89467db32812ab236dbf6d5\n",
      "  Building wheel for elegantrl (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for elegantrl: filename=elegantrl-0.3.6-py3-none-any.whl size=195057 sha256=648b8b3b915b381b1cc4b22bc014ac34009a9e6e3354b65d6c7c38d590235d68\n",
      "  Stored in directory: /tmp/pip-ephem-wheel-cache-nzt2g0py/wheels/a3/c3/be/03eb1f20c8650f23ab13b823d93a297a917899f5d08b04b7b9\n",
      "  Building wheel for gputil (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for gputil: filename=GPUtil-1.4.0-py3-none-any.whl size=7409 sha256=128ea3d8b2e378550652045911996209c256563389960c1a391abad233dc5d85\n",
      "  Stored in directory: /root/.cache/pip/wheels/2b/b5/24/fbb56595c286984f7315ee31821d6121e1b9828436021a88b3\n",
      "  Building wheel for pyfolio (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for pyfolio: filename=pyfolio-0.9.2+75.g4b901f6-py3-none-any.whl size=75774 sha256=304c3cf2274f97d49f88a0746ea7aedb94da76c8c9c362a20268c21fb3bf3b9d\n",
      "  Stored in directory: /tmp/pip-ephem-wheel-cache-nzt2g0py/wheels/da/0d/dd/aef7001cc1238aff04ec9eabfc002341f00c50deead3083855\n",
      "  Building wheel for empyrical (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for empyrical: filename=empyrical-0.5.5-py3-none-any.whl size=39778 sha256=1f988e222ef6300c826b8694dc1773560944fb623b992b46e6590eebbe6b88e2\n",
      "  Stored in directory: /root/.cache/pip/wheels/67/23/d1/a4ef8ff88dc9af7b0eeb1b6fd0d90c6057eaad5a2df25f4e3f\n",
      "  Building wheel for gpustat (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for gpustat: filename=gpustat-1.0.0-py3-none-any.whl size=19887 sha256=a34eb61c162c83f5de438201e45b5ae3a9f87b8d2da3f6183bff03417e0459ef\n",
      "  Stored in directory: /root/.cache/pip/wheels/ce/13/aa/145d9d670feb2cf4a0691b9a3552aafc8a1b49c5162a0f379d\n",
      "  Building wheel for thriftpy2 (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for thriftpy2: filename=thriftpy2-0.4.16-cp39-cp39-linux_x86_64.whl size=1210584 sha256=90ac29e8fbdfc03b58a41fcb53a19bc1af3bc0768e652f3a47606c60de564060\n",
      "  Stored in directory: /root/.cache/pip/wheels/88/a4/d5/907737b4c175aec82087b815fa93a8afea5c6c5a3e7bb748b9\n",
      "  Building wheel for box2d-py (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for box2d-py: filename=box2d_py-2.3.5-cp39-cp39-linux_x86_64.whl size=2807958 sha256=71975db25ca4751c08184c13b0565f51aa5289c8ab90dc70f64fe24589b0bf71\n",
      "  Stored in directory: /root/.cache/pip/wheels/a4/c2/c1/076651c394f05fe60990cd85616c2d95bc1619aa113f559d7d\n",
      "Successfully built finrl pandas_market_calendars gym elegantrl gputil pyfolio empyrical gpustat thriftpy2 box2d-py\n",
      "Installing collected packages: pyglet, py-spy, ply, opencensus-context, nvidia-ml-py, msgpack, gputil, distlib, colorful, box2d-py, appdirs, websockets, websocket-client, virtualenv, thriftpy2, tensorboardX, soupsieve, setuptools, pymysql, pyluach, psutil, multidict, lz4, jedi, importlib-metadata, html5lib, gym, frozenlist, frozendict, deprecation, charset-normalizer, blessed, async-timeout, yarl, requests, pycares, gpustat, cryptography, beautifulsoup4, aiosignal, yfinance, stockstats, stable-baselines3, ray, jqdatasdk, pandas_market_calendars, elegantrl, aiohttp, aiodns, opencensus, empyrical, ccxt, alpaca_trade_api, aiohttp-cors, pyfolio, finrl\n",
      "  Attempting uninstall: msgpack\n",
      "    Found existing installation: msgpack 1.0.4\n",
      "    Uninstalling msgpack-1.0.4:\n",
      "      Successfully uninstalled msgpack-1.0.4\n",
      "  Attempting uninstall: setuptools\n",
      "    Found existing installation: setuptools 57.4.0\n",
      "    Uninstalling setuptools-57.4.0:\n",
      "      Successfully uninstalled setuptools-57.4.0\n",
      "  Attempting uninstall: psutil\n",
      "    Found existing installation: psutil 5.4.8\n",
      "    Uninstalling psutil-5.4.8:\n",
      "      Successfully uninstalled psutil-5.4.8\n",
      "  Attempting uninstall: importlib-metadata\n",
      "    Found existing installation: importlib-metadata 6.0.0\n",
      "    Uninstalling importlib-metadata-6.0.0:\n",
      "      Successfully uninstalled importlib-metadata-6.0.0\n",
      "  Attempting uninstall: html5lib\n",
      "    Found existing installation: html5lib 1.0.1\n",
      "    Uninstalling html5lib-1.0.1:\n",
      "      Successfully uninstalled html5lib-1.0.1\n",
      "  Attempting uninstall: gym\n",
      "    Found existing installation: gym 0.25.2\n",
      "    Uninstalling gym-0.25.2:\n",
      "      Successfully uninstalled gym-0.25.2\n",
      "  Attempting uninstall: requests\n",
      "    Found existing installation: requests 2.25.1\n",
      "    Uninstalling requests-2.25.1:\n",
      "      Successfully uninstalled requests-2.25.1\n",
      "  Attempting uninstall: beautifulsoup4\n",
      "    Found existing installation: beautifulsoup4 4.6.3\n",
      "    Uninstalling beautifulsoup4-4.6.3:\n",
      "      Successfully uninstalled beautifulsoup4-4.6.3\n",
      "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
      "cvxpy 1.2.3 requires setuptools<=64.0.2, but you have setuptools 67.6.0 which is incompatible.\u001b[0m\u001b[31m\n",
      "\u001b[0mSuccessfully installed aiodns-3.0.0 aiohttp-3.8.1 aiohttp-cors-0.7.0 aiosignal-1.3.1 alpaca_trade_api-3.0.0 appdirs-1.4.4 async-timeout-4.0.2 beautifulsoup4-4.11.2 blessed-1.20.0 box2d-py-2.3.5 ccxt-2.9.11 charset-normalizer-2.1.1 colorful-0.5.5 cryptography-39.0.2 deprecation-2.1.0 distlib-0.3.6 elegantrl-0.3.6 empyrical-0.5.5 pandas_market_calendars-3.6.3 finrl-0.3.5 frozendict-2.3.5 frozenlist-1.3.3 gpustat-1.0.0 gputil-1.4.0 gym-0.21.0 html5lib-1.1 importlib-metadata-4.13.0 jedi-0.18.2 jqdatasdk-1.8.11 lz4-4.3.2 msgpack-1.0.3 multidict-6.0.4 nvidia-ml-py-11.495.46 opencensus-0.11.2 opencensus-context-0.1.3 ply-3.11 psutil-5.9.4 py-spy-0.3.14 pycares-4.3.0 pyfolio-0.9.2+75.g4b901f6 pyglet-2.0.5 pyluach-2.2.0 pymysql-1.0.2 ray-2.3.0 requests-2.28.2 setuptools-67.6.0 soupsieve-2.4 stable-baselines3-1.7.0 stockstats-0.5.2 tensorboardX-2.6 thriftpy2-0.4.16 virtualenv-20.20.0 websocket-client-1.5.1 websockets-10.4 yarl-1.8.2 yfinance-0.2.12\n"
     ]
    }
   ],
   "source": [
    "## install required packages\n",
    "!pip install swig\n",
    "!pip install wrds\n",
    "!pip install pyportfolioopt\n",
    "## install finrl library\n",
    "!pip install -q condacolab\n",
    "import condacolab\n",
    "condacolab.install()\n",
    "!apt-get update -y -qq && apt-get install -y -qq cmake libopenmpi-dev python3-dev zlib1g-dev libgl1-mesa-glx swig\n",
    "!pip install git+https://github.com/AI4Finance-Foundation/FinRL.git"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "osBHhVysOEzi"
   },
   "source": [
    "\n",
    "<a id='1.2'></a>\n",
    "## 2.2. A list of Python packages \n",
    "* Yahoo Finance API\n",
    "* pandas\n",
    "* numpy\n",
    "* matplotlib\n",
    "* stockstats\n",
    "* OpenAI gym\n",
    "* stable-baselines\n",
    "* tensorflow\n",
    "* pyfolio"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "nGv01K8Sh1hn"
   },
   "source": [
    "<a id='1.3'></a>\n",
    "## 2.3. Import Packages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "lPqeTTwoh1hn",
    "outputId": "08159edd-35c4-4dd6-8462-3e64f26d71f4"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.9/dist-packages/pyfolio/pos.py:26: UserWarning: Module \"zipline.assets\" not found; multipliers will not be applied to position notionals.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "# matplotlib.use('Agg')\n",
    "import datetime\n",
    "\n",
    "%matplotlib inline\n",
    "from finrl.meta.preprocessor.yahoodownloader import YahooDownloader\n",
    "from finrl.meta.preprocessor.preprocessors import FeatureEngineer, data_split\n",
    "from finrl.meta.env_stock_trading.env_stocktrading import StockTradingEnv\n",
    "from finrl.agents.stablebaselines3.models import DRLAgent\n",
    "from stable_baselines3.common.logger import configure\n",
    "from finrl.meta.data_processor import DataProcessor\n",
    "\n",
    "from finrl.plot import backtest_stats, backtest_plot, get_daily_return, get_baseline\n",
    "from pprint import pprint\n",
    "\n",
    "import sys\n",
    "sys.path.append(\"../FinRL\")\n",
    "\n",
    "import itertools"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "T2owTj985RW4"
   },
   "source": [
    "<a id='1.4'></a>\n",
    "## 2.4. Create Folders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "RtUc_ofKmpdy"
   },
   "outputs": [],
   "source": [
    "from finrl import config\n",
    "from finrl import config_tickers\n",
    "import os\n",
    "from finrl.main import check_and_make_directories\n",
    "from finrl.config import (\n",
    "    DATA_SAVE_DIR,\n",
    "    TRAINED_MODEL_DIR,\n",
    "    TENSORBOARD_LOG_DIR,\n",
    "    RESULTS_DIR,\n",
    "    INDICATORS,\n",
    "    TRAIN_START_DATE,\n",
    "    TRAIN_END_DATE,\n",
    "    TEST_START_DATE,\n",
    "    TEST_END_DATE,\n",
    "    TRADE_START_DATE,\n",
    "    TRADE_END_DATE,\n",
    ")\n",
    "check_and_make_directories([DATA_SAVE_DIR, TRAINED_MODEL_DIR, TENSORBOARD_LOG_DIR, RESULTS_DIR])\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "A289rQWMh1hq"
   },
   "source": [
    "<a id='2'></a>\n",
    "# Part 3. Download Data\n",
    "Yahoo Finance provides stock data, financial news, financial reports, etc. Yahoo Finance is free.\n",
    "* FinRL uses a class **YahooDownloader** in FinRL-Meta to fetch data via Yahoo Finance API\n",
    "* Call Limit: Using the Public API (without authentication), you are limited to 2,000 requests per hour per IP (or up to a total of 48,000 requests a day)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NPeQ7iS-LoMm"
   },
   "source": [
    "\n",
    "\n",
    "-----\n",
    "class YahooDownloader:\n",
    "    Retrieving daily stock data from\n",
    "    Yahoo Finance API\n",
    "\n",
    "    Attributes\n",
    "    ----------\n",
    "        start_date : str\n",
    "            start date of the data (modified from config.py)\n",
    "        end_date : str\n",
    "            end date of the data (modified from config.py)\n",
    "        ticker_list : list\n",
    "            a list of stock tickers (modified from config.py)\n",
    "\n",
    "    Methods\n",
    "    -------\n",
    "    fetch_data()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "h3XJnvrbLp-C",
    "outputId": "2a4358a8-0656-4d5e-dc3e-b693cae3c5b8"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "string"
      },
      "text/plain": [
       "'2020-07-31'"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# from config.py, TRAIN_START_DATE is a string\n",
    "TRAIN_START_DATE\n",
    "# from config.py, TRAIN_END_DATE is a string\n",
    "TRAIN_END_DATE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "id": "FUnY8WEfLq3C"
   },
   "outputs": [],
   "source": [
    "TRAIN_START_DATE = '2010-01-01'\n",
    "TRAIN_END_DATE = '2021-10-01'\n",
    "TRADE_START_DATE = '2021-10-01'\n",
    "TRADE_END_DATE = '2023-03-01'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "yCKm4om-s9kE",
    "outputId": "a9d4f123-e338-4eca-feb1-358503317d9a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "Shape of DataFrame:  (97013, 8)\n"
     ]
    }
   ],
   "source": [
    "df = YahooDownloader(start_date = TRAIN_START_DATE,\n",
    "                     end_date = TRADE_END_DATE,\n",
    "                     ticker_list = config_tickers.DOW_30_TICKER).fetch_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "JzqRRTOX6aFu",
    "outputId": "e302049c-08e1-4ff0-ce60-7faf71776eb7"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['AXP', 'AMGN', 'AAPL', 'BA', 'CAT', 'CSCO', 'CVX', 'GS', 'HD', 'HON', 'IBM', 'INTC', 'JNJ', 'KO', 'JPM', 'MCD', 'MMM', 'MRK', 'MSFT', 'NKE', 'PG', 'TRV', 'UNH', 'CRM', 'VZ', 'V', 'WBA', 'WMT', 'DIS', 'DOW']\n"
     ]
    }
   ],
   "source": [
    "print(config_tickers.DOW_30_TICKER)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "CV3HrZHLh1hy",
    "outputId": "81ee90f7-c290-40d9-81a0-8b771f3699ed"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(97013, 8)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "4hYkeaPiICHS",
    "outputId": "b64d30ce-6f5a-461e-c6fe-1baee4642b4d"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-5e0f2423-743c-49d5-b435-c73c39a5d717\">\n",
       "    <div class=\"colab-df-container\">\n",
       "      <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>tic</th>\n",
       "      <th>day</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>7.622500</td>\n",
       "      <td>7.660714</td>\n",
       "      <td>7.585000</td>\n",
       "      <td>6.505280</td>\n",
       "      <td>493729600</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>56.630001</td>\n",
       "      <td>57.869999</td>\n",
       "      <td>56.560001</td>\n",
       "      <td>42.888943</td>\n",
       "      <td>5277400</td>\n",
       "      <td>AMGN</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>40.810001</td>\n",
       "      <td>41.099998</td>\n",
       "      <td>40.389999</td>\n",
       "      <td>33.675961</td>\n",
       "      <td>6894300</td>\n",
       "      <td>AXP</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>55.720001</td>\n",
       "      <td>56.389999</td>\n",
       "      <td>54.799999</td>\n",
       "      <td>43.777538</td>\n",
       "      <td>6186700</td>\n",
       "      <td>BA</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>57.650002</td>\n",
       "      <td>59.189999</td>\n",
       "      <td>57.509998</td>\n",
       "      <td>41.156910</td>\n",
       "      <td>7325600</td>\n",
       "      <td>CAT</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-5e0f2423-743c-49d5-b435-c73c39a5d717')\"\n",
       "              title=\"Convert this dataframe to an interactive table.\"\n",
       "              style=\"display:none;\">\n",
       "        \n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
       "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
       "  </svg>\n",
       "      </button>\n",
       "      \n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      flex-wrap:wrap;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "      <script>\n",
       "        const buttonEl =\n",
       "          document.querySelector('#df-5e0f2423-743c-49d5-b435-c73c39a5d717 button.colab-df-convert');\n",
       "        buttonEl.style.display =\n",
       "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "        async function convertToInteractive(key) {\n",
       "          const element = document.querySelector('#df-5e0f2423-743c-49d5-b435-c73c39a5d717');\n",
       "          const dataTable =\n",
       "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                     [key], {});\n",
       "          if (!dataTable) return;\n",
       "\n",
       "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "            + ' to learn more about interactive tables.';\n",
       "          element.innerHTML = '';\n",
       "          dataTable['output_type'] = 'display_data';\n",
       "          await google.colab.output.renderOutput(dataTable, element);\n",
       "          const docLink = document.createElement('div');\n",
       "          docLink.innerHTML = docLinkHtml;\n",
       "          element.appendChild(docLink);\n",
       "        }\n",
       "      </script>\n",
       "    </div>\n",
       "  </div>\n",
       "  "
      ],
      "text/plain": [
       "         date       open       high        low      close     volume   tic  \\\n",
       "0  2010-01-04   7.622500   7.660714   7.585000   6.505280  493729600  AAPL   \n",
       "1  2010-01-04  56.630001  57.869999  56.560001  42.888943    5277400  AMGN   \n",
       "2  2010-01-04  40.810001  41.099998  40.389999  33.675961    6894300   AXP   \n",
       "3  2010-01-04  55.720001  56.389999  54.799999  43.777538    6186700    BA   \n",
       "4  2010-01-04  57.650002  59.189999  57.509998  41.156910    7325600   CAT   \n",
       "\n",
       "   day  \n",
       "0    0  \n",
       "1    0  \n",
       "2    0  \n",
       "3    0  \n",
       "4    0  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sort_values(['date','tic'],ignore_index=True).head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "uqC6c40Zh1iH"
   },
   "source": [
    "# Part 4: Preprocess Data\n",
    "We need to check for missing data and do feature engineering to convert the data point into a state.\n",
    "* **Adding technical indicators**. In practical trading, various information needs to be taken into account, such as historical prices, current holding shares, technical indicators, etc. Here, we demonstrate two trend-following technical indicators: MACD and RSI.\n",
    "* **Adding turbulence index**. Risk-aversion reflects whether an investor prefers to protect the capital. It also influences one's trading strategy when facing different market volatility level. To control the risk in a worst-case scenario, such as financial crisis of 2007–2008, FinRL employs the turbulence index that measures extreme fluctuation of asset price."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "PmKP-1ii3RLS",
    "outputId": "6e4b4cc7-593b-4403-eb2a-828f55ed5a89"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Successfully added technical indicators\n",
      "[*********************100%***********************]  1 of 1 completed\n",
      "Shape of DataFrame:  (3310, 8)\n",
      "Successfully added vix\n",
      "Successfully added turbulence index\n"
     ]
    }
   ],
   "source": [
    "fe = FeatureEngineer(\n",
    "                    use_technical_indicator=True,\n",
    "                    tech_indicator_list = INDICATORS,\n",
    "                    use_vix=True,\n",
    "                    use_turbulence=True,\n",
    "                    user_defined_feature = False)\n",
    "\n",
    "processed = fe.preprocess_data(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "id": "Kixon2tR3RLT"
   },
   "outputs": [],
   "source": [
    "list_ticker = processed[\"tic\"].unique().tolist()\n",
    "list_date = list(pd.date_range(processed['date'].min(),processed['date'].max()).astype(str))\n",
    "combination = list(itertools.product(list_date,list_ticker))\n",
    "\n",
    "processed_full = pd.DataFrame(combination,columns=[\"date\",\"tic\"]).merge(processed,on=[\"date\",\"tic\"],how=\"left\")\n",
    "processed_full = processed_full[processed_full['date'].isin(processed['date'])]\n",
    "processed_full = processed_full.sort_values(['date','tic'])\n",
    "\n",
    "processed_full = processed_full.fillna(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 407
    },
    "id": "grvhGJJII3Xn",
    "outputId": "627d411c-d197-4019-8940-4d88a68dbfc9"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-f0f7393d-e1de-4655-ae33-9b9d0e5bdb7c\">\n",
       "    <div class=\"colab-df-container\">\n",
       "      <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>tic</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>day</th>\n",
       "      <th>macd</th>\n",
       "      <th>boll_ub</th>\n",
       "      <th>boll_lb</th>\n",
       "      <th>rsi_30</th>\n",
       "      <th>cci_30</th>\n",
       "      <th>dx_30</th>\n",
       "      <th>close_30_sma</th>\n",
       "      <th>close_60_sma</th>\n",
       "      <th>vix</th>\n",
       "      <th>turbulence</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>7.622500</td>\n",
       "      <td>7.660714</td>\n",
       "      <td>7.585000</td>\n",
       "      <td>6.505280</td>\n",
       "      <td>493729600.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>6.505280</td>\n",
       "      <td>6.505280</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>AMGN</td>\n",
       "      <td>56.630001</td>\n",
       "      <td>57.869999</td>\n",
       "      <td>56.560001</td>\n",
       "      <td>42.888943</td>\n",
       "      <td>5277400.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>42.888943</td>\n",
       "      <td>42.888943</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>AXP</td>\n",
       "      <td>40.810001</td>\n",
       "      <td>41.099998</td>\n",
       "      <td>40.389999</td>\n",
       "      <td>33.675961</td>\n",
       "      <td>6894300.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>33.675961</td>\n",
       "      <td>33.675961</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>BA</td>\n",
       "      <td>55.720001</td>\n",
       "      <td>56.389999</td>\n",
       "      <td>54.799999</td>\n",
       "      <td>43.777538</td>\n",
       "      <td>6186700.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>43.777538</td>\n",
       "      <td>43.777538</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>CAT</td>\n",
       "      <td>57.650002</td>\n",
       "      <td>59.189999</td>\n",
       "      <td>57.509998</td>\n",
       "      <td>41.156910</td>\n",
       "      <td>7325600.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>41.156910</td>\n",
       "      <td>41.156910</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>CRM</td>\n",
       "      <td>18.652500</td>\n",
       "      <td>18.882500</td>\n",
       "      <td>18.547501</td>\n",
       "      <td>18.705000</td>\n",
       "      <td>7906000.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>18.705000</td>\n",
       "      <td>18.705000</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>CSCO</td>\n",
       "      <td>24.110001</td>\n",
       "      <td>24.840000</td>\n",
       "      <td>24.010000</td>\n",
       "      <td>17.394125</td>\n",
       "      <td>59853700.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>17.394125</td>\n",
       "      <td>17.394125</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>CVX</td>\n",
       "      <td>78.199997</td>\n",
       "      <td>79.199997</td>\n",
       "      <td>78.160004</td>\n",
       "      <td>46.851871</td>\n",
       "      <td>10173800.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>46.851871</td>\n",
       "      <td>46.851871</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>DIS</td>\n",
       "      <td>32.500000</td>\n",
       "      <td>32.750000</td>\n",
       "      <td>31.870001</td>\n",
       "      <td>27.933922</td>\n",
       "      <td>13700400.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>27.933922</td>\n",
       "      <td>27.933922</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>GS</td>\n",
       "      <td>170.050003</td>\n",
       "      <td>174.250000</td>\n",
       "      <td>169.509995</td>\n",
       "      <td>139.862900</td>\n",
       "      <td>9135000.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.526809</td>\n",
       "      <td>6.494997</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.666667</td>\n",
       "      <td>100.0</td>\n",
       "      <td>139.862900</td>\n",
       "      <td>139.862900</td>\n",
       "      <td>20.040001</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-f0f7393d-e1de-4655-ae33-9b9d0e5bdb7c')\"\n",
       "              title=\"Convert this dataframe to an interactive table.\"\n",
       "              style=\"display:none;\">\n",
       "        \n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
       "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
       "  </svg>\n",
       "      </button>\n",
       "      \n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      flex-wrap:wrap;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "      <script>\n",
       "        const buttonEl =\n",
       "          document.querySelector('#df-f0f7393d-e1de-4655-ae33-9b9d0e5bdb7c button.colab-df-convert');\n",
       "        buttonEl.style.display =\n",
       "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "        async function convertToInteractive(key) {\n",
       "          const element = document.querySelector('#df-f0f7393d-e1de-4655-ae33-9b9d0e5bdb7c');\n",
       "          const dataTable =\n",
       "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                     [key], {});\n",
       "          if (!dataTable) return;\n",
       "\n",
       "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "            + ' to learn more about interactive tables.';\n",
       "          element.innerHTML = '';\n",
       "          dataTable['output_type'] = 'display_data';\n",
       "          await google.colab.output.renderOutput(dataTable, element);\n",
       "          const docLink = document.createElement('div');\n",
       "          docLink.innerHTML = docLinkHtml;\n",
       "          element.appendChild(docLink);\n",
       "        }\n",
       "      </script>\n",
       "    </div>\n",
       "  </div>\n",
       "  "
      ],
      "text/plain": [
       "         date   tic        open        high         low       close  \\\n",
       "0  2010-01-04  AAPL    7.622500    7.660714    7.585000    6.505280   \n",
       "1  2010-01-04  AMGN   56.630001   57.869999   56.560001   42.888943   \n",
       "2  2010-01-04   AXP   40.810001   41.099998   40.389999   33.675961   \n",
       "3  2010-01-04    BA   55.720001   56.389999   54.799999   43.777538   \n",
       "4  2010-01-04   CAT   57.650002   59.189999   57.509998   41.156910   \n",
       "5  2010-01-04   CRM   18.652500   18.882500   18.547501   18.705000   \n",
       "6  2010-01-04  CSCO   24.110001   24.840000   24.010000   17.394125   \n",
       "7  2010-01-04   CVX   78.199997   79.199997   78.160004   46.851871   \n",
       "8  2010-01-04   DIS   32.500000   32.750000   31.870001   27.933922   \n",
       "9  2010-01-04    GS  170.050003  174.250000  169.509995  139.862900   \n",
       "\n",
       "        volume  day  macd   boll_ub   boll_lb  rsi_30     cci_30  dx_30  \\\n",
       "0  493729600.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "1    5277400.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "2    6894300.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "3    6186700.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "4    7325600.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "5    7906000.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "6   59853700.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "7   10173800.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "8   13700400.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "9    9135000.0  0.0   0.0  6.526809  6.494997   100.0  66.666667  100.0   \n",
       "\n",
       "   close_30_sma  close_60_sma        vix  turbulence  \n",
       "0      6.505280      6.505280  20.040001         0.0  \n",
       "1     42.888943     42.888943  20.040001         0.0  \n",
       "2     33.675961     33.675961  20.040001         0.0  \n",
       "3     43.777538     43.777538  20.040001         0.0  \n",
       "4     41.156910     41.156910  20.040001         0.0  \n",
       "5     18.705000     18.705000  20.040001         0.0  \n",
       "6     17.394125     17.394125  20.040001         0.0  \n",
       "7     46.851871     46.851871  20.040001         0.0  \n",
       "8     27.933922     27.933922  20.040001         0.0  \n",
       "9    139.862900    139.862900  20.040001         0.0  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "processed_full.sort_values(['date','tic'],ignore_index=True).head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "id": "5vdORQ384Qx-"
   },
   "outputs": [],
   "source": [
    "mvo_df = processed_full.sort_values(['date','tic'],ignore_index=True)[['date','tic','close']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "-QsYaY0Dh1iw"
   },
   "source": [
    "<a id='4'></a>\n",
    "# Part 5. Build A Market Environment in OpenAI Gym-style\n",
    "The training process involves observing stock price change, taking an action and reward's calculation. By interacting with the market environment, the agent will eventually derive a trading strategy that may maximize (expected) rewards.\n",
    "\n",
    "Our market environment, based on OpenAI Gym, simulates stock markets with historical market data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5TOhcryx44bb"
   },
   "source": [
    "## Data Split\n",
    "We split the data into training set and testing set as follows:\n",
    "\n",
    "Training data period: 2009-01-01 to 2020-07-01\n",
    "\n",
    "Trading data period: 2020-07-01 to 2021-10-31\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "W0qaVGjLtgbI",
    "outputId": "5e364280-c418-470f-e25c-f03f56adbda7"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "85753\n",
      "10237\n"
     ]
    }
   ],
   "source": [
    "train = data_split(processed_full, TRAIN_START_DATE,TRAIN_END_DATE)\n",
    "trade = data_split(processed_full, TRADE_START_DATE,TRADE_END_DATE)\n",
    "print(len(train))\n",
    "print(len(trade))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 444
    },
    "id": "p52zNCOhTtLR",
    "outputId": "e205ad4d-49ad-472b-8b60-0dc14a629113"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-90f2e3b9-5218-49d2-afd3-91bb0e5df514\">\n",
       "    <div class=\"colab-df-container\">\n",
       "      <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>tic</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>day</th>\n",
       "      <th>macd</th>\n",
       "      <th>boll_ub</th>\n",
       "      <th>boll_lb</th>\n",
       "      <th>rsi_30</th>\n",
       "      <th>cci_30</th>\n",
       "      <th>dx_30</th>\n",
       "      <th>close_30_sma</th>\n",
       "      <th>close_60_sma</th>\n",
       "      <th>vix</th>\n",
       "      <th>turbulence</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2956</th>\n",
       "      <td>2021-09-30</td>\n",
       "      <td>UNH</td>\n",
       "      <td>401.489990</td>\n",
       "      <td>403.489990</td>\n",
       "      <td>390.459991</td>\n",
       "      <td>383.180145</td>\n",
       "      <td>3779900.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>-4.349257</td>\n",
       "      <td>419.212249</td>\n",
       "      <td>386.863767</td>\n",
       "      <td>40.895372</td>\n",
       "      <td>-222.938263</td>\n",
       "      <td>41.980385</td>\n",
       "      <td>405.947460</td>\n",
       "      <td>405.438415</td>\n",
       "      <td>23.139999</td>\n",
       "      <td>24.871997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2956</th>\n",
       "      <td>2021-09-30</td>\n",
       "      <td>V</td>\n",
       "      <td>227.580002</td>\n",
       "      <td>228.789993</td>\n",
       "      <td>222.630005</td>\n",
       "      <td>220.257767</td>\n",
       "      <td>7128500.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>-1.538726</td>\n",
       "      <td>228.639288</td>\n",
       "      <td>216.529588</td>\n",
       "      <td>44.078992</td>\n",
       "      <td>-54.614561</td>\n",
       "      <td>19.569853</td>\n",
       "      <td>224.777294</td>\n",
       "      <td>231.479429</td>\n",
       "      <td>23.139999</td>\n",
       "      <td>24.871997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2956</th>\n",
       "      <td>2021-09-30</td>\n",
       "      <td>VZ</td>\n",
       "      <td>54.500000</td>\n",
       "      <td>54.509998</td>\n",
       "      <td>54.000000</td>\n",
       "      <td>49.822678</td>\n",
       "      <td>18736600.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>-0.237533</td>\n",
       "      <td>50.960816</td>\n",
       "      <td>49.550736</td>\n",
       "      <td>41.824914</td>\n",
       "      <td>-102.899147</td>\n",
       "      <td>21.682953</td>\n",
       "      <td>50.425972</td>\n",
       "      <td>50.960237</td>\n",
       "      <td>23.139999</td>\n",
       "      <td>24.871997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2956</th>\n",
       "      <td>2021-09-30</td>\n",
       "      <td>WBA</td>\n",
       "      <td>48.790001</td>\n",
       "      <td>48.930000</td>\n",
       "      <td>46.919998</td>\n",
       "      <td>43.957283</td>\n",
       "      <td>6449400.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>-0.253540</td>\n",
       "      <td>48.531811</td>\n",
       "      <td>43.597245</td>\n",
       "      <td>44.613717</td>\n",
       "      <td>-107.390242</td>\n",
       "      <td>0.941150</td>\n",
       "      <td>45.886550</td>\n",
       "      <td>44.857786</td>\n",
       "      <td>23.139999</td>\n",
       "      <td>24.871997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2956</th>\n",
       "      <td>2021-09-30</td>\n",
       "      <td>WMT</td>\n",
       "      <td>140.639999</td>\n",
       "      <td>141.729996</td>\n",
       "      <td>139.250000</td>\n",
       "      <td>136.672668</td>\n",
       "      <td>7485900.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>-1.561206</td>\n",
       "      <td>146.754148</td>\n",
       "      <td>136.189053</td>\n",
       "      <td>40.165800</td>\n",
       "      <td>-151.553868</td>\n",
       "      <td>45.466733</td>\n",
       "      <td>142.928735</td>\n",
       "      <td>141.825645</td>\n",
       "      <td>23.139999</td>\n",
       "      <td>24.871997</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-90f2e3b9-5218-49d2-afd3-91bb0e5df514')\"\n",
       "              title=\"Convert this dataframe to an interactive table.\"\n",
       "              style=\"display:none;\">\n",
       "        \n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
       "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
       "  </svg>\n",
       "      </button>\n",
       "      \n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      flex-wrap:wrap;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "      <script>\n",
       "        const buttonEl =\n",
       "          document.querySelector('#df-90f2e3b9-5218-49d2-afd3-91bb0e5df514 button.colab-df-convert');\n",
       "        buttonEl.style.display =\n",
       "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "        async function convertToInteractive(key) {\n",
       "          const element = document.querySelector('#df-90f2e3b9-5218-49d2-afd3-91bb0e5df514');\n",
       "          const dataTable =\n",
       "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                     [key], {});\n",
       "          if (!dataTable) return;\n",
       "\n",
       "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "            + ' to learn more about interactive tables.';\n",
       "          element.innerHTML = '';\n",
       "          dataTable['output_type'] = 'display_data';\n",
       "          await google.colab.output.renderOutput(dataTable, element);\n",
       "          const docLink = document.createElement('div');\n",
       "          docLink.innerHTML = docLinkHtml;\n",
       "          element.appendChild(docLink);\n",
       "        }\n",
       "      </script>\n",
       "    </div>\n",
       "  </div>\n",
       "  "
      ],
      "text/plain": [
       "            date  tic        open        high         low       close  \\\n",
       "2956  2021-09-30  UNH  401.489990  403.489990  390.459991  383.180145   \n",
       "2956  2021-09-30    V  227.580002  228.789993  222.630005  220.257767   \n",
       "2956  2021-09-30   VZ   54.500000   54.509998   54.000000   49.822678   \n",
       "2956  2021-09-30  WBA   48.790001   48.930000   46.919998   43.957283   \n",
       "2956  2021-09-30  WMT  140.639999  141.729996  139.250000  136.672668   \n",
       "\n",
       "          volume  day      macd     boll_ub     boll_lb     rsi_30  \\\n",
       "2956   3779900.0  3.0 -4.349257  419.212249  386.863767  40.895372   \n",
       "2956   7128500.0  3.0 -1.538726  228.639288  216.529588  44.078992   \n",
       "2956  18736600.0  3.0 -0.237533   50.960816   49.550736  41.824914   \n",
       "2956   6449400.0  3.0 -0.253540   48.531811   43.597245  44.613717   \n",
       "2956   7485900.0  3.0 -1.561206  146.754148  136.189053  40.165800   \n",
       "\n",
       "          cci_30      dx_30  close_30_sma  close_60_sma        vix  turbulence  \n",
       "2956 -222.938263  41.980385    405.947460    405.438415  23.139999   24.871997  \n",
       "2956  -54.614561  19.569853    224.777294    231.479429  23.139999   24.871997  \n",
       "2956 -102.899147  21.682953     50.425972     50.960237  23.139999   24.871997  \n",
       "2956 -107.390242   0.941150     45.886550     44.857786  23.139999   24.871997  \n",
       "2956 -151.553868  45.466733    142.928735    141.825645  23.139999   24.871997  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 357
    },
    "id": "k9zU9YaTTvFq",
    "outputId": "b23fd388-7411-4c78-8ebf-eb33df9b40a4"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-10ebda38-ede1-43c1-b44d-c81afef0afd2\">\n",
       "    <div class=\"colab-df-container\">\n",
       "      <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>tic</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>day</th>\n",
       "      <th>macd</th>\n",
       "      <th>boll_ub</th>\n",
       "      <th>boll_lb</th>\n",
       "      <th>rsi_30</th>\n",
       "      <th>cci_30</th>\n",
       "      <th>dx_30</th>\n",
       "      <th>close_30_sma</th>\n",
       "      <th>close_60_sma</th>\n",
       "      <th>vix</th>\n",
       "      <th>turbulence</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>141.899994</td>\n",
       "      <td>142.919998</td>\n",
       "      <td>139.110001</td>\n",
       "      <td>141.404266</td>\n",
       "      <td>94639600.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>-1.703487</td>\n",
       "      <td>155.382845</td>\n",
       "      <td>137.132192</td>\n",
       "      <td>46.927735</td>\n",
       "      <td>-142.190143</td>\n",
       "      <td>41.749873</td>\n",
       "      <td>147.171798</td>\n",
       "      <td>146.269416</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>AMGN</td>\n",
       "      <td>213.589996</td>\n",
       "      <td>214.610001</td>\n",
       "      <td>210.800003</td>\n",
       "      <td>203.845886</td>\n",
       "      <td>2629400.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>-3.097331</td>\n",
       "      <td>212.767983</td>\n",
       "      <td>199.379593</td>\n",
       "      <td>40.408568</td>\n",
       "      <td>-96.756949</td>\n",
       "      <td>36.189244</td>\n",
       "      <td>208.480831</td>\n",
       "      <td>217.103342</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>AXP</td>\n",
       "      <td>168.500000</td>\n",
       "      <td>175.119995</td>\n",
       "      <td>168.479996</td>\n",
       "      <td>170.695389</td>\n",
       "      <td>3956000.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.281748</td>\n",
       "      <td>174.864263</td>\n",
       "      <td>149.785746</td>\n",
       "      <td>56.265103</td>\n",
       "      <td>117.565552</td>\n",
       "      <td>15.667511</td>\n",
       "      <td>161.812905</td>\n",
       "      <td>164.064442</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>BA</td>\n",
       "      <td>222.850006</td>\n",
       "      <td>226.720001</td>\n",
       "      <td>220.600006</td>\n",
       "      <td>226.000000</td>\n",
       "      <td>9113600.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.730320</td>\n",
       "      <td>226.909442</td>\n",
       "      <td>205.727561</td>\n",
       "      <td>51.614047</td>\n",
       "      <td>116.649440</td>\n",
       "      <td>2.027170</td>\n",
       "      <td>217.175334</td>\n",
       "      <td>221.968500</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>CAT</td>\n",
       "      <td>192.899994</td>\n",
       "      <td>195.869995</td>\n",
       "      <td>191.240005</td>\n",
       "      <td>187.928040</td>\n",
       "      <td>3695500.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>-3.640323</td>\n",
       "      <td>205.735917</td>\n",
       "      <td>181.432778</td>\n",
       "      <td>41.999441</td>\n",
       "      <td>-112.087750</td>\n",
       "      <td>36.203176</td>\n",
       "      <td>196.993865</td>\n",
       "      <td>200.522105</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-10ebda38-ede1-43c1-b44d-c81afef0afd2')\"\n",
       "              title=\"Convert this dataframe to an interactive table.\"\n",
       "              style=\"display:none;\">\n",
       "        \n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
       "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
       "  </svg>\n",
       "      </button>\n",
       "      \n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      flex-wrap:wrap;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "      <script>\n",
       "        const buttonEl =\n",
       "          document.querySelector('#df-10ebda38-ede1-43c1-b44d-c81afef0afd2 button.colab-df-convert');\n",
       "        buttonEl.style.display =\n",
       "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "        async function convertToInteractive(key) {\n",
       "          const element = document.querySelector('#df-10ebda38-ede1-43c1-b44d-c81afef0afd2');\n",
       "          const dataTable =\n",
       "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                     [key], {});\n",
       "          if (!dataTable) return;\n",
       "\n",
       "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "            + ' to learn more about interactive tables.';\n",
       "          element.innerHTML = '';\n",
       "          dataTable['output_type'] = 'display_data';\n",
       "          await google.colab.output.renderOutput(dataTable, element);\n",
       "          const docLink = document.createElement('div');\n",
       "          docLink.innerHTML = docLinkHtml;\n",
       "          element.appendChild(docLink);\n",
       "        }\n",
       "      </script>\n",
       "    </div>\n",
       "  </div>\n",
       "  "
      ],
      "text/plain": [
       "         date   tic        open        high         low       close  \\\n",
       "0  2021-10-01  AAPL  141.899994  142.919998  139.110001  141.404266   \n",
       "0  2021-10-01  AMGN  213.589996  214.610001  210.800003  203.845886   \n",
       "0  2021-10-01   AXP  168.500000  175.119995  168.479996  170.695389   \n",
       "0  2021-10-01    BA  222.850006  226.720001  220.600006  226.000000   \n",
       "0  2021-10-01   CAT  192.899994  195.869995  191.240005  187.928040   \n",
       "\n",
       "       volume  day      macd     boll_ub     boll_lb     rsi_30      cci_30  \\\n",
       "0  94639600.0  4.0 -1.703487  155.382845  137.132192  46.927735 -142.190143   \n",
       "0   2629400.0  4.0 -3.097331  212.767983  199.379593  40.408568  -96.756949   \n",
       "0   3956000.0  4.0  2.281748  174.864263  149.785746  56.265103  117.565552   \n",
       "0   9113600.0  4.0  0.730320  226.909442  205.727561  51.614047  116.649440   \n",
       "0   3695500.0  4.0 -3.640323  205.735917  181.432778  41.999441 -112.087750   \n",
       "\n",
       "       dx_30  close_30_sma  close_60_sma   vix  turbulence  \n",
       "0  41.749873    147.171798    146.269416  21.1  120.122917  \n",
       "0  36.189244    208.480831    217.103342  21.1  120.122917  \n",
       "0  15.667511    161.812905    164.064442  21.1  120.122917  \n",
       "0   2.027170    217.175334    221.968500  21.1  120.122917  \n",
       "0  36.203176    196.993865    200.522105  21.1  120.122917  "
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trade.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "zYN573SOHhxG",
    "outputId": "a9353918-3ff6-4179-e645-1e6c664b4506"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['macd',\n",
       " 'boll_ub',\n",
       " 'boll_lb',\n",
       " 'rsi_30',\n",
       " 'cci_30',\n",
       " 'dx_30',\n",
       " 'close_30_sma',\n",
       " 'close_60_sma']"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "INDICATORS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Q2zqII8rMIqn",
    "outputId": "687c0ea8-d3d9-460a-d104-d088db843e5b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stock Dimension: 29, State Space: 291\n"
     ]
    }
   ],
   "source": [
    "stock_dimension = len(train.tic.unique())\n",
    "state_space = 1 + 2*stock_dimension + len(INDICATORS)*stock_dimension\n",
    "print(f\"Stock Dimension: {stock_dimension}, State Space: {state_space}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "id": "AWyp84Ltto19"
   },
   "outputs": [],
   "source": [
    "buy_cost_list = sell_cost_list = [0.001] * stock_dimension\n",
    "num_stock_shares = [0] * stock_dimension\n",
    "\n",
    "env_kwargs = {\n",
    "    \"hmax\": 100,\n",
    "    \"initial_amount\": 1000000,\n",
    "    \"num_stock_shares\": num_stock_shares,\n",
    "    \"buy_cost_pct\": buy_cost_list,\n",
    "    \"sell_cost_pct\": sell_cost_list,\n",
    "    \"state_space\": state_space,\n",
    "    \"stock_dim\": stock_dimension,\n",
    "    \"tech_indicator_list\": INDICATORS,\n",
    "    \"action_space\": stock_dimension,\n",
    "    \"reward_scaling\": 1e-4\n",
    "}\n",
    "\n",
    "\n",
    "e_train_gym = StockTradingEnv(df = train, **env_kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "64EoqOrQjiVf"
   },
   "source": [
    "## Environment for Training\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "xwSvvPjutpqS",
    "outputId": "ad3318cc-a3c6-41ee-cdeb-a4eb317e33bf"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'stable_baselines3.common.vec_env.dummy_vec_env.DummyVecEnv'>\n"
     ]
    }
   ],
   "source": [
    "env_train, _ = e_train_gym.get_sb_env()\n",
    "print(type(env_train))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HMNR5nHjh1iz"
   },
   "source": [
    "<a id='5'></a>\n",
    "# Part 6: Train DRL Agents\n",
    "* The DRL algorithms are from **Stable Baselines 3**. Users are also encouraged to try **ElegantRL** and **Ray RLlib**.\n",
    "* FinRL includes fine-tuned standard DRL algorithms, such as DQN, DDPG, Multi-Agent DDPG, PPO, SAC, A2C and TD3. We also allow users to\n",
    "design their own DRL algorithms by adapting these DRL algorithms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "id": "364PsqckttcQ"
   },
   "outputs": [],
   "source": [
    "agent = DRLAgent(env = env_train)\n",
    "\n",
    "if_using_a2c = True\n",
    "if_using_ddpg = True\n",
    "if_using_ppo = True\n",
    "if_using_td3 = True\n",
    "if_using_sac = True\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "YDmqOyF9h1iz"
   },
   "source": [
    "### Agent Training: 5 algorithms (A2C, DDPG, PPO, TD3, SAC)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "uijiWgkuh1jB"
   },
   "source": [
    "### Agent 1: A2C\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "GUCnkn-HIbmj",
    "outputId": "6da723f6-2f9b-4d76-8872-328ef56dadfc"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'n_steps': 5, 'ent_coef': 0.01, 'learning_rate': 0.0007}\n",
      "Using cpu device\n",
      "Logging to results/a2c\n"
     ]
    }
   ],
   "source": [
    "agent = DRLAgent(env = env_train)\n",
    "model_a2c = agent.get_model(\"a2c\")\n",
    "\n",
    "if if_using_a2c:\n",
    "  # set up logger\n",
    "  tmp_path = RESULTS_DIR + '/a2c'\n",
    "  new_logger_a2c = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n",
    "  # Set new logger\n",
    "  model_a2c.set_logger(new_logger_a2c)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "0GVpkWGqH4-D",
    "outputId": "a919c17f-f561-45fa-8b55-3c996811a63e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 42        |\n",
      "|    iterations         | 100       |\n",
      "|    time_elapsed       | 11        |\n",
      "|    total_timesteps    | 500       |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.2     |\n",
      "|    explained_variance | 5.96e-08  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 99        |\n",
      "|    policy_loss        | -59.6     |\n",
      "|    reward             | 1.0448978 |\n",
      "|    std                | 1         |\n",
      "|    value_loss         | 3.62      |\n",
      "-------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 51        |\n",
      "|    iterations         | 200       |\n",
      "|    time_elapsed       | 19        |\n",
      "|    total_timesteps    | 1000      |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.2     |\n",
      "|    explained_variance | 0.105     |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 199       |\n",
      "|    policy_loss        | -66.6     |\n",
      "|    reward             | 0.9660278 |\n",
      "|    std                | 1         |\n",
      "|    value_loss         | 11.9      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 52         |\n",
      "|    iterations         | 300        |\n",
      "|    time_elapsed       | 28         |\n",
      "|    total_timesteps    | 1500       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.2      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 299        |\n",
      "|    policy_loss        | -183       |\n",
      "|    reward             | -2.3506932 |\n",
      "|    std                | 1          |\n",
      "|    value_loss         | 33.1       |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 57        |\n",
      "|    iterations         | 400       |\n",
      "|    time_elapsed       | 34        |\n",
      "|    total_timesteps    | 2000      |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.3     |\n",
      "|    explained_variance | 1.19e-07  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 399       |\n",
      "|    policy_loss        | 106       |\n",
      "|    reward             | 1.2101291 |\n",
      "|    std                | 1         |\n",
      "|    value_loss         | 8.09      |\n",
      "-------------------------------------\n",
      "------------------------------------\n",
      "| time/                 |          |\n",
      "|    fps                | 58       |\n",
      "|    iterations         | 500      |\n",
      "|    time_elapsed       | 42       |\n",
      "|    total_timesteps    | 2500     |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -41.2    |\n",
      "|    explained_variance | 0        |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 499      |\n",
      "|    policy_loss        | 54.7     |\n",
      "|    reward             | -2.13098 |\n",
      "|    std                | 1        |\n",
      "|    value_loss         | 6.34     |\n",
      "------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 56        |\n",
      "|    iterations         | 600       |\n",
      "|    time_elapsed       | 52        |\n",
      "|    total_timesteps    | 3000      |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.3     |\n",
      "|    explained_variance | 5.96e-08  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 599       |\n",
      "|    policy_loss        | 24.6      |\n",
      "|    reward             | 0.3384871 |\n",
      "|    std                | 1         |\n",
      "|    value_loss         | 0.374     |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 56         |\n",
      "|    iterations         | 700        |\n",
      "|    time_elapsed       | 61         |\n",
      "|    total_timesteps    | 3500       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.3      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 699        |\n",
      "|    policy_loss        | 0.997      |\n",
      "|    reward             | 0.25741363 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 0.106      |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 58         |\n",
      "|    iterations         | 800        |\n",
      "|    time_elapsed       | 68         |\n",
      "|    total_timesteps    | 4000       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.4      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 799        |\n",
      "|    policy_loss        | 10.1       |\n",
      "|    reward             | 0.31647584 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 2.35       |\n",
      "--------------------------------------\n",
      "------------------------------------\n",
      "| time/                 |          |\n",
      "|    fps                | 59       |\n",
      "|    iterations         | 900      |\n",
      "|    time_elapsed       | 76       |\n",
      "|    total_timesteps    | 4500     |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -41.4    |\n",
      "|    explained_variance | 0        |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 899      |\n",
      "|    policy_loss        | 83.2     |\n",
      "|    reward             | 3.478022 |\n",
      "|    std                | 1.01     |\n",
      "|    value_loss         | 7.25     |\n",
      "------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 60        |\n",
      "|    iterations         | 1000      |\n",
      "|    time_elapsed       | 83        |\n",
      "|    total_timesteps    | 5000      |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.4     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 999       |\n",
      "|    policy_loss        | -287      |\n",
      "|    reward             | 5.5255313 |\n",
      "|    std                | 1.01      |\n",
      "|    value_loss         | 108       |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 60         |\n",
      "|    iterations         | 1100       |\n",
      "|    time_elapsed       | 90         |\n",
      "|    total_timesteps    | 5500       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.4      |\n",
      "|    explained_variance | -1.19e-07  |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 1099       |\n",
      "|    policy_loss        | 238        |\n",
      "|    reward             | 0.19302495 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 66.5       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 60         |\n",
      "|    iterations         | 1200       |\n",
      "|    time_elapsed       | 98         |\n",
      "|    total_timesteps    | 6000       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.4      |\n",
      "|    explained_variance | 0.235      |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 1199       |\n",
      "|    policy_loss        | -42.8      |\n",
      "|    reward             | -1.7718072 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 1.57       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 1300       |\n",
      "|    time_elapsed       | 104        |\n",
      "|    total_timesteps    | 6500       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.4      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 1299       |\n",
      "|    policy_loss        | -153       |\n",
      "|    reward             | 0.53076863 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 16         |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 60        |\n",
      "|    iterations         | 1400      |\n",
      "|    time_elapsed       | 115       |\n",
      "|    total_timesteps    | 7000      |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.5     |\n",
      "|    explained_variance | 0.0758    |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 1399      |\n",
      "|    policy_loss        | 127       |\n",
      "|    reward             | 1.5990568 |\n",
      "|    std                | 1.01      |\n",
      "|    value_loss         | 12        |\n",
      "-------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 1500        |\n",
      "|    time_elapsed       | 122         |\n",
      "|    total_timesteps    | 7500        |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -41.6       |\n",
      "|    explained_variance | 0.0174      |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 1499        |\n",
      "|    policy_loss        | 43.1        |\n",
      "|    reward             | -0.78735256 |\n",
      "|    std                | 1.02        |\n",
      "|    value_loss         | 3.28        |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 1600       |\n",
      "|    time_elapsed       | 130        |\n",
      "|    total_timesteps    | 8000       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.7      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 1599       |\n",
      "|    policy_loss        | -62.8      |\n",
      "|    reward             | -3.9351795 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 10.2       |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 1700      |\n",
      "|    time_elapsed       | 138       |\n",
      "|    total_timesteps    | 8500      |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.7     |\n",
      "|    explained_variance | -0.00197  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 1699      |\n",
      "|    policy_loss        | 863       |\n",
      "|    reward             | 15.370292 |\n",
      "|    std                | 1.02      |\n",
      "|    value_loss         | 432       |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 1800       |\n",
      "|    time_elapsed       | 144        |\n",
      "|    total_timesteps    | 9000       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.6      |\n",
      "|    explained_variance | -0.0663    |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 1799       |\n",
      "|    policy_loss        | -105       |\n",
      "|    reward             | 0.48280737 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 9.89       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 60         |\n",
      "|    iterations         | 1900       |\n",
      "|    time_elapsed       | 155        |\n",
      "|    total_timesteps    | 9500       |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.6      |\n",
      "|    explained_variance | 1.19e-07   |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 1899       |\n",
      "|    policy_loss        | -113       |\n",
      "|    reward             | 0.26411447 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 10.8       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 2000       |\n",
      "|    time_elapsed       | 163        |\n",
      "|    total_timesteps    | 10000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.6      |\n",
      "|    explained_variance | -0.227     |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 1999       |\n",
      "|    policy_loss        | 54.7       |\n",
      "|    reward             | 0.29459578 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 2.48       |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 2100      |\n",
      "|    time_elapsed       | 171       |\n",
      "|    total_timesteps    | 10500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.6     |\n",
      "|    explained_variance | -0.00482  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 2099      |\n",
      "|    policy_loss        | -41.9     |\n",
      "|    reward             | 1.0095307 |\n",
      "|    std                | 1.02      |\n",
      "|    value_loss         | 1.75      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 2200       |\n",
      "|    time_elapsed       | 177        |\n",
      "|    total_timesteps    | 11000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.5      |\n",
      "|    explained_variance | -0.00284   |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 2199       |\n",
      "|    policy_loss        | 35.1       |\n",
      "|    reward             | -1.4420356 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 1.64       |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 2300      |\n",
      "|    time_elapsed       | 186       |\n",
      "|    total_timesteps    | 11500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.6     |\n",
      "|    explained_variance | 0.0362    |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 2299      |\n",
      "|    policy_loss        | 307       |\n",
      "|    reward             | 0.8030618 |\n",
      "|    std                | 1.02      |\n",
      "|    value_loss         | 58.7      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 2400       |\n",
      "|    time_elapsed       | 192        |\n",
      "|    total_timesteps    | 12000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.6      |\n",
      "|    explained_variance | -0.0606    |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 2399       |\n",
      "|    policy_loss        | 67.6       |\n",
      "|    reward             | 0.21994063 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 3.12       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 2500       |\n",
      "|    time_elapsed       | 201        |\n",
      "|    total_timesteps    | 12500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.5      |\n",
      "|    explained_variance | -1.19e-07  |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 2499       |\n",
      "|    policy_loss        | -15.3      |\n",
      "|    reward             | 0.06845646 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 0.694      |\n",
      "--------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 62          |\n",
      "|    iterations         | 2600        |\n",
      "|    time_elapsed       | 207         |\n",
      "|    total_timesteps    | 13000       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -41.5       |\n",
      "|    explained_variance | -1.19e-07   |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 2599        |\n",
      "|    policy_loss        | 43.1        |\n",
      "|    reward             | -0.10593105 |\n",
      "|    std                | 1.01        |\n",
      "|    value_loss         | 2.32        |\n",
      "---------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 62          |\n",
      "|    iterations         | 2700        |\n",
      "|    time_elapsed       | 217         |\n",
      "|    total_timesteps    | 13500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -41.5       |\n",
      "|    explained_variance | 0           |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 2699        |\n",
      "|    policy_loss        | -3.26       |\n",
      "|    reward             | -0.76443106 |\n",
      "|    std                | 1.01        |\n",
      "|    value_loss         | 0.466       |\n",
      "---------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 2800      |\n",
      "|    time_elapsed       | 225       |\n",
      "|    total_timesteps    | 14000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.5     |\n",
      "|    explained_variance | 1.19e-07  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 2799      |\n",
      "|    policy_loss        | -84.6     |\n",
      "|    reward             | 1.0745509 |\n",
      "|    std                | 1.01      |\n",
      "|    value_loss         | 4.8       |\n",
      "-------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 2900        |\n",
      "|    time_elapsed       | 234         |\n",
      "|    total_timesteps    | 14500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -41.4       |\n",
      "|    explained_variance | 1.19e-07    |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 2899        |\n",
      "|    policy_loss        | 489         |\n",
      "|    reward             | -0.22960186 |\n",
      "|    std                | 1.01        |\n",
      "|    value_loss         | 203         |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 3000       |\n",
      "|    time_elapsed       | 240        |\n",
      "|    total_timesteps    | 15000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.5      |\n",
      "|    explained_variance | -0.14      |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 2999       |\n",
      "|    policy_loss        | -11.4      |\n",
      "|    reward             | -0.5049368 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 0.505      |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 3100      |\n",
      "|    time_elapsed       | 249       |\n",
      "|    total_timesteps    | 15500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.5     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 3099      |\n",
      "|    policy_loss        | -99.8     |\n",
      "|    reward             | 0.4471302 |\n",
      "|    std                | 1.01      |\n",
      "|    value_loss         | 9.26      |\n",
      "-------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 3200      |\n",
      "|    time_elapsed       | 255       |\n",
      "|    total_timesteps    | 16000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.5     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 3199      |\n",
      "|    policy_loss        | 178       |\n",
      "|    reward             | 1.2417748 |\n",
      "|    std                | 1.01      |\n",
      "|    value_loss         | 26.9      |\n",
      "-------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 3300        |\n",
      "|    time_elapsed       | 266         |\n",
      "|    total_timesteps    | 16500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -41.5       |\n",
      "|    explained_variance | 0           |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 3299        |\n",
      "|    policy_loss        | -31.2       |\n",
      "|    reward             | 0.031511165 |\n",
      "|    std                | 1.01        |\n",
      "|    value_loss         | 0.802       |\n",
      "---------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 3400      |\n",
      "|    time_elapsed       | 273       |\n",
      "|    total_timesteps    | 17000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.5     |\n",
      "|    explained_variance | 1.19e-07  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 3399      |\n",
      "|    policy_loss        | -148      |\n",
      "|    reward             | 4.5629287 |\n",
      "|    std                | 1.01      |\n",
      "|    value_loss         | 53.8      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 3500       |\n",
      "|    time_elapsed       | 280        |\n",
      "|    total_timesteps    | 17500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.5      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 3499       |\n",
      "|    policy_loss        | 67.3       |\n",
      "|    reward             | -2.2339873 |\n",
      "|    std                | 1.01       |\n",
      "|    value_loss         | 47.8       |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 3600      |\n",
      "|    time_elapsed       | 289       |\n",
      "|    total_timesteps    | 18000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.5     |\n",
      "|    explained_variance | 0.0153    |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 3599      |\n",
      "|    policy_loss        | -0.856    |\n",
      "|    reward             | 0.2917868 |\n",
      "|    std                | 1.01      |\n",
      "|    value_loss         | 0.0752    |\n",
      "-------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 62          |\n",
      "|    iterations         | 3700        |\n",
      "|    time_elapsed       | 295         |\n",
      "|    total_timesteps    | 18500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -41.6       |\n",
      "|    explained_variance | 0           |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 3699        |\n",
      "|    policy_loss        | 18.7        |\n",
      "|    reward             | 0.030824203 |\n",
      "|    std                | 1.02        |\n",
      "|    value_loss         | 1.25        |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 3800       |\n",
      "|    time_elapsed       | 306        |\n",
      "|    total_timesteps    | 19000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.6      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 3799       |\n",
      "|    policy_loss        | -70.4      |\n",
      "|    reward             | -0.2733519 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 8.28       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 3900       |\n",
      "|    time_elapsed       | 313        |\n",
      "|    total_timesteps    | 19500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.6      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 3899       |\n",
      "|    policy_loss        | 17.6       |\n",
      "|    reward             | 0.17095129 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 0.764      |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 4000       |\n",
      "|    time_elapsed       | 322        |\n",
      "|    total_timesteps    | 20000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.7      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 3999       |\n",
      "|    policy_loss        | -1.15e+03  |\n",
      "|    reward             | -1.5058991 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 666        |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 4100       |\n",
      "|    time_elapsed       | 329        |\n",
      "|    total_timesteps    | 20500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.7      |\n",
      "|    explained_variance | 1.19e-07   |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 4099       |\n",
      "|    policy_loss        | 309        |\n",
      "|    reward             | -2.3266535 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 56.7       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 4200       |\n",
      "|    time_elapsed       | 338        |\n",
      "|    total_timesteps    | 21000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.8      |\n",
      "|    explained_variance | 2.38e-07   |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 4199       |\n",
      "|    policy_loss        | -18.2      |\n",
      "|    reward             | -1.3121804 |\n",
      "|    std                | 1.02       |\n",
      "|    value_loss         | 0.717      |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 4300      |\n",
      "|    time_elapsed       | 345       |\n",
      "|    total_timesteps    | 21500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -41.8     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 4299      |\n",
      "|    policy_loss        | 44.2      |\n",
      "|    reward             | 0.3224479 |\n",
      "|    std                | 1.02      |\n",
      "|    value_loss         | 1.09      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 4400       |\n",
      "|    time_elapsed       | 355        |\n",
      "|    total_timesteps    | 22000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -41.9      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 4399       |\n",
      "|    policy_loss        | 12         |\n",
      "|    reward             | -3.8448317 |\n",
      "|    std                | 1.03       |\n",
      "|    value_loss         | 0.994      |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 4500      |\n",
      "|    time_elapsed       | 362       |\n",
      "|    total_timesteps    | 22500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42       |\n",
      "|    explained_variance | -0.000148 |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 4499      |\n",
      "|    policy_loss        | 36.3      |\n",
      "|    reward             | 3.5755417 |\n",
      "|    std                | 1.03      |\n",
      "|    value_loss         | 1.65      |\n",
      "-------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 62          |\n",
      "|    iterations         | 4600        |\n",
      "|    time_elapsed       | 370         |\n",
      "|    total_timesteps    | 23000       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -41.9       |\n",
      "|    explained_variance | 0           |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 4599        |\n",
      "|    policy_loss        | 213         |\n",
      "|    reward             | -0.56036687 |\n",
      "|    std                | 1.03        |\n",
      "|    value_loss         | 51          |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 4700       |\n",
      "|    time_elapsed       | 377        |\n",
      "|    total_timesteps    | 23500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42        |\n",
      "|    explained_variance | -1.19e-07  |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 4699       |\n",
      "|    policy_loss        | 197        |\n",
      "|    reward             | -6.2142897 |\n",
      "|    std                | 1.03       |\n",
      "|    value_loss         | 33.6       |\n",
      "--------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 62          |\n",
      "|    iterations         | 4800        |\n",
      "|    time_elapsed       | 385         |\n",
      "|    total_timesteps    | 24000       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42         |\n",
      "|    explained_variance | 1.19e-07    |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 4799        |\n",
      "|    policy_loss        | 1.84        |\n",
      "|    reward             | -0.40594038 |\n",
      "|    std                | 1.03        |\n",
      "|    value_loss         | 0.297       |\n",
      "---------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 62          |\n",
      "|    iterations         | 4900        |\n",
      "|    time_elapsed       | 395         |\n",
      "|    total_timesteps    | 24500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42.1       |\n",
      "|    explained_variance | -1.19e-07   |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 4899        |\n",
      "|    policy_loss        | 17.3        |\n",
      "|    reward             | -0.11167521 |\n",
      "|    std                | 1.03        |\n",
      "|    value_loss         | 0.374       |\n",
      "---------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 5000      |\n",
      "|    time_elapsed       | 402       |\n",
      "|    total_timesteps    | 25000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.1     |\n",
      "|    explained_variance | 0.00414   |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 4999      |\n",
      "|    policy_loss        | -227      |\n",
      "|    reward             | 0.8466212 |\n",
      "|    std                | 1.03      |\n",
      "|    value_loss         | 28.6      |\n",
      "-------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 62          |\n",
      "|    iterations         | 5100        |\n",
      "|    time_elapsed       | 410         |\n",
      "|    total_timesteps    | 25500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42.1       |\n",
      "|    explained_variance | 0.00168     |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 5099        |\n",
      "|    policy_loss        | 294         |\n",
      "|    reward             | -0.38854757 |\n",
      "|    std                | 1.03        |\n",
      "|    value_loss         | 46.4        |\n",
      "---------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 62        |\n",
      "|    iterations         | 5200      |\n",
      "|    time_elapsed       | 418       |\n",
      "|    total_timesteps    | 26000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.1     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 5199      |\n",
      "|    policy_loss        | 206       |\n",
      "|    reward             | 0.5009032 |\n",
      "|    std                | 1.04      |\n",
      "|    value_loss         | 51.1      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 5300       |\n",
      "|    time_elapsed       | 427        |\n",
      "|    total_timesteps    | 26500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.1      |\n",
      "|    explained_variance | 1.19e-07   |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 5299       |\n",
      "|    policy_loss        | 893        |\n",
      "|    reward             | -3.5664086 |\n",
      "|    std                | 1.03       |\n",
      "|    value_loss         | 437        |\n",
      "--------------------------------------\n",
      "day: 2956, episode: 10\n",
      "begin_total_asset: 1000000.00\n",
      "end_total_asset: 6234728.14\n",
      "total_reward: 5234728.14\n",
      "total_cost: 26372.84\n",
      "total_trades: 46613\n",
      "Sharpe: 0.901\n",
      "=================================\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 5400        |\n",
      "|    time_elapsed       | 437         |\n",
      "|    total_timesteps    | 27000       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42.1       |\n",
      "|    explained_variance | 0           |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 5399        |\n",
      "|    policy_loss        | -91.9       |\n",
      "|    reward             | -0.70080554 |\n",
      "|    std                | 1.03        |\n",
      "|    value_loss         | 4.79        |\n",
      "---------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 5500        |\n",
      "|    time_elapsed       | 445         |\n",
      "|    total_timesteps    | 27500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42         |\n",
      "|    explained_variance | -0.00337    |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 5499        |\n",
      "|    policy_loss        | 113         |\n",
      "|    reward             | -0.49402773 |\n",
      "|    std                | 1.03        |\n",
      "|    value_loss         | 6.68        |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 5600       |\n",
      "|    time_elapsed       | 452        |\n",
      "|    total_timesteps    | 28000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42        |\n",
      "|    explained_variance | 1.19e-07   |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 5599       |\n",
      "|    policy_loss        | 81.2       |\n",
      "|    reward             | 0.93675065 |\n",
      "|    std                | 1.03       |\n",
      "|    value_loss         | 6.81       |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 5700      |\n",
      "|    time_elapsed       | 460       |\n",
      "|    total_timesteps    | 28500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.1     |\n",
      "|    explained_variance | -1.19e-07 |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 5699      |\n",
      "|    policy_loss        | 35.6      |\n",
      "|    reward             | 1.6135367 |\n",
      "|    std                | 1.03      |\n",
      "|    value_loss         | 3.44      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 62         |\n",
      "|    iterations         | 5800       |\n",
      "|    time_elapsed       | 466        |\n",
      "|    total_timesteps    | 29000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.1      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 5799       |\n",
      "|    policy_loss        | 344        |\n",
      "|    reward             | -3.7252083 |\n",
      "|    std                | 1.04       |\n",
      "|    value_loss         | 71.3       |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 5900      |\n",
      "|    time_elapsed       | 480       |\n",
      "|    total_timesteps    | 29500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.1     |\n",
      "|    explained_variance | 7.75e-07  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 5899      |\n",
      "|    policy_loss        | -243      |\n",
      "|    reward             | -5.271583 |\n",
      "|    std                | 1.03      |\n",
      "|    value_loss         | 37.6      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 60         |\n",
      "|    iterations         | 6000       |\n",
      "|    time_elapsed       | 494        |\n",
      "|    total_timesteps    | 30000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.2      |\n",
      "|    explained_variance | -1.19e-07  |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 5999       |\n",
      "|    policy_loss        | -124       |\n",
      "|    reward             | 0.39913905 |\n",
      "|    std                | 1.04       |\n",
      "|    value_loss         | 9.03       |\n",
      "--------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 60          |\n",
      "|    iterations         | 6100        |\n",
      "|    time_elapsed       | 501         |\n",
      "|    total_timesteps    | 30500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42.2       |\n",
      "|    explained_variance | 5.96e-08    |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 6099        |\n",
      "|    policy_loss        | 39.8        |\n",
      "|    reward             | -0.43069157 |\n",
      "|    std                | 1.04        |\n",
      "|    value_loss         | 1.84        |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 60         |\n",
      "|    iterations         | 6200       |\n",
      "|    time_elapsed       | 509        |\n",
      "|    total_timesteps    | 31000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.2      |\n",
      "|    explained_variance | 0.0522     |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 6199       |\n",
      "|    policy_loss        | -163       |\n",
      "|    reward             | -2.9920352 |\n",
      "|    std                | 1.04       |\n",
      "|    value_loss         | 37.3       |\n",
      "--------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 60          |\n",
      "|    iterations         | 6300        |\n",
      "|    time_elapsed       | 518         |\n",
      "|    total_timesteps    | 31500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42.3       |\n",
      "|    explained_variance | 0           |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 6299        |\n",
      "|    policy_loss        | -25.6       |\n",
      "|    reward             | -0.82676774 |\n",
      "|    std                | 1.04        |\n",
      "|    value_loss         | 2.24        |\n",
      "---------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 60        |\n",
      "|    iterations         | 6400      |\n",
      "|    time_elapsed       | 527       |\n",
      "|    total_timesteps    | 32000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.3     |\n",
      "|    explained_variance | -1.19e-07 |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 6399      |\n",
      "|    policy_loss        | -167      |\n",
      "|    reward             | 2.0950716 |\n",
      "|    std                | 1.04      |\n",
      "|    value_loss         | 20.7      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 60         |\n",
      "|    iterations         | 6500       |\n",
      "|    time_elapsed       | 534        |\n",
      "|    total_timesteps    | 32500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.2      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 6499       |\n",
      "|    policy_loss        | 449        |\n",
      "|    reward             | -3.8287592 |\n",
      "|    std                | 1.04       |\n",
      "|    value_loss         | 110        |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 60         |\n",
      "|    iterations         | 6600       |\n",
      "|    time_elapsed       | 541        |\n",
      "|    total_timesteps    | 33000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.3      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 6599       |\n",
      "|    policy_loss        | -87.1      |\n",
      "|    reward             | -1.7947876 |\n",
      "|    std                | 1.04       |\n",
      "|    value_loss         | 4.44       |\n",
      "--------------------------------------\n",
      "------------------------------------\n",
      "| time/                 |          |\n",
      "|    fps                | 60       |\n",
      "|    iterations         | 6700     |\n",
      "|    time_elapsed       | 549      |\n",
      "|    total_timesteps    | 33500    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -42.3    |\n",
      "|    explained_variance | 0        |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 6699     |\n",
      "|    policy_loss        | 26.3     |\n",
      "|    reward             | 1.126185 |\n",
      "|    std                | 1.04     |\n",
      "|    value_loss         | 0.538    |\n",
      "------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 6800       |\n",
      "|    time_elapsed       | 555        |\n",
      "|    total_timesteps    | 34000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.4      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 6799       |\n",
      "|    policy_loss        | 41.3       |\n",
      "|    reward             | -1.5093899 |\n",
      "|    std                | 1.05       |\n",
      "|    value_loss         | 1.69       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 60         |\n",
      "|    iterations         | 6900       |\n",
      "|    time_elapsed       | 567        |\n",
      "|    total_timesteps    | 34500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.4      |\n",
      "|    explained_variance | -1.19e-07  |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 6899       |\n",
      "|    policy_loss        | 55.8       |\n",
      "|    reward             | 0.29027587 |\n",
      "|    std                | 1.05       |\n",
      "|    value_loss         | 2.8        |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 60        |\n",
      "|    iterations         | 7000      |\n",
      "|    time_elapsed       | 573       |\n",
      "|    total_timesteps    | 35000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.4     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 6999      |\n",
      "|    policy_loss        | -78.1     |\n",
      "|    reward             | 5.1948047 |\n",
      "|    std                | 1.04      |\n",
      "|    value_loss         | 12.9      |\n",
      "-------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 60        |\n",
      "|    iterations         | 7100      |\n",
      "|    time_elapsed       | 583       |\n",
      "|    total_timesteps    | 35500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.3     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 7099      |\n",
      "|    policy_loss        | 7.26      |\n",
      "|    reward             | 0.2690911 |\n",
      "|    std                | 1.04      |\n",
      "|    value_loss         | 0.0616    |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 7200       |\n",
      "|    time_elapsed       | 589        |\n",
      "|    total_timesteps    | 36000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.4      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 7199       |\n",
      "|    policy_loss        | -34.5      |\n",
      "|    reward             | 0.09704677 |\n",
      "|    std                | 1.05       |\n",
      "|    value_loss         | 0.696      |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 7300       |\n",
      "|    time_elapsed       | 598        |\n",
      "|    total_timesteps    | 36500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.5      |\n",
      "|    explained_variance | -1.19e-07  |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 7299       |\n",
      "|    policy_loss        | 72         |\n",
      "|    reward             | -1.0637515 |\n",
      "|    std                | 1.05       |\n",
      "|    value_loss         | 4.12       |\n",
      "--------------------------------------\n",
      "------------------------------------\n",
      "| time/                 |          |\n",
      "|    fps                | 60       |\n",
      "|    iterations         | 7400     |\n",
      "|    time_elapsed       | 607      |\n",
      "|    total_timesteps    | 37000    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -42.5    |\n",
      "|    explained_variance | 0        |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 7399     |\n",
      "|    policy_loss        | -284     |\n",
      "|    reward             | 2.948475 |\n",
      "|    std                | 1.05     |\n",
      "|    value_loss         | 55.3     |\n",
      "------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 60        |\n",
      "|    iterations         | 7500      |\n",
      "|    time_elapsed       | 615       |\n",
      "|    total_timesteps    | 37500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.6     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 7499      |\n",
      "|    policy_loss        | -25.3     |\n",
      "|    reward             | 3.2265134 |\n",
      "|    std                | 1.05      |\n",
      "|    value_loss         | 2.78      |\n",
      "-------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 7600      |\n",
      "|    time_elapsed       | 622       |\n",
      "|    total_timesteps    | 38000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.6     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 7599      |\n",
      "|    policy_loss        | 34.3      |\n",
      "|    reward             | 1.6018704 |\n",
      "|    std                | 1.05      |\n",
      "|    value_loss         | 3.27      |\n",
      "-------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 7700        |\n",
      "|    time_elapsed       | 631         |\n",
      "|    total_timesteps    | 38500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42.6       |\n",
      "|    explained_variance | 0           |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 7699        |\n",
      "|    policy_loss        | -1.18       |\n",
      "|    reward             | 0.013757705 |\n",
      "|    std                | 1.05        |\n",
      "|    value_loss         | 0.112       |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 7800       |\n",
      "|    time_elapsed       | 637        |\n",
      "|    total_timesteps    | 39000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.7      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 7799       |\n",
      "|    policy_loss        | -0.182     |\n",
      "|    reward             | -0.7317939 |\n",
      "|    std                | 1.06       |\n",
      "|    value_loss         | 0.0712     |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 7900      |\n",
      "|    time_elapsed       | 645       |\n",
      "|    total_timesteps    | 39500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.7     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 7899      |\n",
      "|    policy_loss        | -49.5     |\n",
      "|    reward             | 0.9202336 |\n",
      "|    std                | 1.06      |\n",
      "|    value_loss         | 1.42      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 8000       |\n",
      "|    time_elapsed       | 655        |\n",
      "|    total_timesteps    | 40000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.7      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 7999       |\n",
      "|    policy_loss        | -51.1      |\n",
      "|    reward             | 0.32330602 |\n",
      "|    std                | 1.06       |\n",
      "|    value_loss         | 1.6        |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 8100      |\n",
      "|    time_elapsed       | 661       |\n",
      "|    total_timesteps    | 40500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.8     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 8099      |\n",
      "|    policy_loss        | -176      |\n",
      "|    reward             | 3.9807708 |\n",
      "|    std                | 1.06      |\n",
      "|    value_loss         | 31.4      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 8200       |\n",
      "|    time_elapsed       | 670        |\n",
      "|    total_timesteps    | 41000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.8      |\n",
      "|    explained_variance | 2.38e-07   |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 8199       |\n",
      "|    policy_loss        | -1.05e+03  |\n",
      "|    reward             | -6.0956445 |\n",
      "|    std                | 1.06       |\n",
      "|    value_loss         | 708        |\n",
      "--------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 8300        |\n",
      "|    time_elapsed       | 676         |\n",
      "|    total_timesteps    | 41500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42.7       |\n",
      "|    explained_variance | 0.164       |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 8299        |\n",
      "|    policy_loss        | -96.1       |\n",
      "|    reward             | -0.54658353 |\n",
      "|    std                | 1.06        |\n",
      "|    value_loss         | 8.1         |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 8400       |\n",
      "|    time_elapsed       | 685        |\n",
      "|    total_timesteps    | 42000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.8      |\n",
      "|    explained_variance | 0.322      |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 8399       |\n",
      "|    policy_loss        | -46.6      |\n",
      "|    reward             | -0.2206827 |\n",
      "|    std                | 1.06       |\n",
      "|    value_loss         | 1.35       |\n",
      "--------------------------------------\n",
      "------------------------------------\n",
      "| time/                 |          |\n",
      "|    fps                | 61       |\n",
      "|    iterations         | 8500     |\n",
      "|    time_elapsed       | 694      |\n",
      "|    total_timesteps    | 42500    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -42.8    |\n",
      "|    explained_variance | 0        |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 8499     |\n",
      "|    policy_loss        | 0.284    |\n",
      "|    reward             | 1.638819 |\n",
      "|    std                | 1.06     |\n",
      "|    value_loss         | 0.299    |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| time/                 |          |\n",
      "|    fps                | 61       |\n",
      "|    iterations         | 8600     |\n",
      "|    time_elapsed       | 703      |\n",
      "|    total_timesteps    | 43000    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -42.8    |\n",
      "|    explained_variance | 0        |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 8599     |\n",
      "|    policy_loss        | -33.1    |\n",
      "|    reward             | 1.487439 |\n",
      "|    std                | 1.06     |\n",
      "|    value_loss         | 1.31     |\n",
      "------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 8700      |\n",
      "|    time_elapsed       | 709       |\n",
      "|    total_timesteps    | 43500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.8     |\n",
      "|    explained_variance | 0.00745   |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 8699      |\n",
      "|    policy_loss        | -173      |\n",
      "|    reward             | 3.1066616 |\n",
      "|    std                | 1.06      |\n",
      "|    value_loss         | 20.3      |\n",
      "-------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 8800      |\n",
      "|    time_elapsed       | 718       |\n",
      "|    total_timesteps    | 44000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.8     |\n",
      "|    explained_variance | 5.96e-08  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 8799      |\n",
      "|    policy_loss        | 194       |\n",
      "|    reward             | -4.730858 |\n",
      "|    std                | 1.06      |\n",
      "|    value_loss         | 43.7      |\n",
      "-------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 8900      |\n",
      "|    time_elapsed       | 724       |\n",
      "|    total_timesteps    | 44500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.8     |\n",
      "|    explained_variance | -0.0334   |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 8899      |\n",
      "|    policy_loss        | 65.8      |\n",
      "|    reward             | 1.4894711 |\n",
      "|    std                | 1.06      |\n",
      "|    value_loss         | 2.43      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 9000       |\n",
      "|    time_elapsed       | 733        |\n",
      "|    total_timesteps    | 45000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -42.9      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 8999       |\n",
      "|    policy_loss        | 93.7       |\n",
      "|    reward             | -0.5122968 |\n",
      "|    std                | 1.06       |\n",
      "|    value_loss         | 4.8        |\n",
      "--------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 9100        |\n",
      "|    time_elapsed       | 742         |\n",
      "|    total_timesteps    | 45500       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -42.9       |\n",
      "|    explained_variance | -1.19e-07   |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 9099        |\n",
      "|    policy_loss        | -48.2       |\n",
      "|    reward             | 0.037780657 |\n",
      "|    std                | 1.07        |\n",
      "|    value_loss         | 1.67        |\n",
      "---------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 9200      |\n",
      "|    time_elapsed       | 749       |\n",
      "|    total_timesteps    | 46000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.9     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 9199      |\n",
      "|    policy_loss        | 39.1      |\n",
      "|    reward             | -0.753926 |\n",
      "|    std                | 1.07      |\n",
      "|    value_loss         | 1.14      |\n",
      "-------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 9300      |\n",
      "|    time_elapsed       | 758       |\n",
      "|    total_timesteps    | 46500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.9     |\n",
      "|    explained_variance | 5.96e-08  |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 9299      |\n",
      "|    policy_loss        | 150       |\n",
      "|    reward             | 2.2911668 |\n",
      "|    std                | 1.07      |\n",
      "|    value_loss         | 12.8      |\n",
      "-------------------------------------\n",
      "------------------------------------\n",
      "| time/                 |          |\n",
      "|    fps                | 61       |\n",
      "|    iterations         | 9400     |\n",
      "|    time_elapsed       | 764      |\n",
      "|    total_timesteps    | 47000    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -42.9    |\n",
      "|    explained_variance | 0        |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 9399     |\n",
      "|    policy_loss        | 60.4     |\n",
      "|    reward             | 1.652799 |\n",
      "|    std                | 1.06     |\n",
      "|    value_loss         | 28.4     |\n",
      "------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 9500      |\n",
      "|    time_elapsed       | 774       |\n",
      "|    total_timesteps    | 47500     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -42.9     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 9499      |\n",
      "|    policy_loss        | 13.2      |\n",
      "|    reward             | 0.3117458 |\n",
      "|    std                | 1.07      |\n",
      "|    value_loss         | 0.367     |\n",
      "-------------------------------------\n",
      "---------------------------------------\n",
      "| time/                 |             |\n",
      "|    fps                | 61          |\n",
      "|    iterations         | 9600        |\n",
      "|    time_elapsed       | 782         |\n",
      "|    total_timesteps    | 48000       |\n",
      "| train/                |             |\n",
      "|    entropy_loss       | -43         |\n",
      "|    explained_variance | 1.79e-07    |\n",
      "|    learning_rate      | 0.0007      |\n",
      "|    n_updates          | 9599        |\n",
      "|    policy_loss        | 17.5        |\n",
      "|    reward             | -0.11562487 |\n",
      "|    std                | 1.07        |\n",
      "|    value_loss         | 0.556       |\n",
      "---------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 9700       |\n",
      "|    time_elapsed       | 791        |\n",
      "|    total_timesteps    | 48500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -43        |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 9699       |\n",
      "|    policy_loss        | 36.2       |\n",
      "|    reward             | -1.2007029 |\n",
      "|    std                | 1.07       |\n",
      "|    value_loss         | 0.953      |\n",
      "--------------------------------------\n",
      "-------------------------------------\n",
      "| time/                 |           |\n",
      "|    fps                | 61        |\n",
      "|    iterations         | 9800      |\n",
      "|    time_elapsed       | 797       |\n",
      "|    total_timesteps    | 49000     |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -43.1     |\n",
      "|    explained_variance | 0         |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 9799      |\n",
      "|    policy_loss        | -194      |\n",
      "|    reward             | -0.755971 |\n",
      "|    std                | 1.07      |\n",
      "|    value_loss         | 21.9      |\n",
      "-------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 9900       |\n",
      "|    time_elapsed       | 806        |\n",
      "|    total_timesteps    | 49500      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -43.1      |\n",
      "|    explained_variance | -1.19e-07  |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 9899       |\n",
      "|    policy_loss        | -10.8      |\n",
      "|    reward             | -1.7145721 |\n",
      "|    std                | 1.07       |\n",
      "|    value_loss         | 1.55       |\n",
      "--------------------------------------\n",
      "--------------------------------------\n",
      "| time/                 |            |\n",
      "|    fps                | 61         |\n",
      "|    iterations         | 10000      |\n",
      "|    time_elapsed       | 813        |\n",
      "|    total_timesteps    | 50000      |\n",
      "| train/                |            |\n",
      "|    entropy_loss       | -43.1      |\n",
      "|    explained_variance | 0          |\n",
      "|    learning_rate      | 0.0007     |\n",
      "|    n_updates          | 9999       |\n",
      "|    policy_loss        | -21.2      |\n",
      "|    reward             | -4.7046494 |\n",
      "|    std                | 1.07       |\n",
      "|    value_loss         | 1.92       |\n",
      "--------------------------------------\n"
     ]
    }
   ],
   "source": [
    "trained_a2c = agent.train_model(model=model_a2c, \n",
    "                             tb_log_name='a2c',\n",
    "                             total_timesteps=50000) if if_using_a2c else None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "MRiOtrywfAo1"
   },
   "source": [
    "### Agent 2: DDPG"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "M2YadjfnLwgt",
    "outputId": "883736bb-5b14-4306-816f-b7596b90275d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'batch_size': 128, 'buffer_size': 50000, 'learning_rate': 0.001}\n",
      "Using cpu device\n",
      "Logging to results/ddpg\n"
     ]
    }
   ],
   "source": [
    "agent = DRLAgent(env = env_train)\n",
    "model_ddpg = agent.get_model(\"ddpg\")\n",
    "\n",
    "if if_using_ddpg:\n",
    "  # set up logger\n",
    "  tmp_path = RESULTS_DIR + '/ddpg'\n",
    "  new_logger_ddpg = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n",
    "  # Set new logger\n",
    "  model_ddpg.set_logger(new_logger_ddpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "tCDa78rqfO_a",
    "outputId": "c9962d70-9180-4377-daa7-0ae7363b8091"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "day: 2956, episode: 20\n",
      "begin_total_asset: 1000000.00\n",
      "end_total_asset: 5442983.33\n",
      "total_reward: 4442983.33\n",
      "total_cost: 1749.20\n",
      "total_trades: 36503\n",
      "Sharpe: 0.890\n",
      "=================================\n",
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 4          |\n",
      "|    fps             | 24         |\n",
      "|    time_elapsed    | 491        |\n",
      "|    total_timesteps | 11828      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | 8.32       |\n",
      "|    critic_loss     | 55.7       |\n",
      "|    learning_rate   | 0.001      |\n",
      "|    n_updates       | 8871       |\n",
      "|    reward          | -7.7807484 |\n",
      "-----------------------------------\n",
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 8          |\n",
      "|    fps             | 21         |\n",
      "|    time_elapsed    | 1104       |\n",
      "|    total_timesteps | 23656      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | 0.904      |\n",
      "|    critic_loss     | 4.34       |\n",
      "|    learning_rate   | 0.001      |\n",
      "|    n_updates       | 20699      |\n",
      "|    reward          | -7.7807484 |\n",
      "-----------------------------------\n",
      "day: 2956, episode: 30\n",
      "begin_total_asset: 1000000.00\n",
      "end_total_asset: 4945534.62\n",
      "total_reward: 3945534.62\n",
      "total_cost: 999.00\n",
      "total_trades: 38403\n",
      "Sharpe: 0.813\n",
      "=================================\n",
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 12         |\n",
      "|    fps             | 20         |\n",
      "|    time_elapsed    | 1727       |\n",
      "|    total_timesteps | 35484      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | -4.02      |\n",
      "|    critic_loss     | 2.49       |\n",
      "|    learning_rate   | 0.001      |\n",
      "|    n_updates       | 32527      |\n",
      "|    reward          | -7.7807484 |\n",
      "-----------------------------------\n",
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 16         |\n",
      "|    fps             | 20         |\n",
      "|    time_elapsed    | 2359       |\n",
      "|    total_timesteps | 47312      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | -7.06      |\n",
      "|    critic_loss     | 1.67       |\n",
      "|    learning_rate   | 0.001      |\n",
      "|    n_updates       | 44355      |\n",
      "|    reward          | -7.7807484 |\n",
      "-----------------------------------\n"
     ]
    }
   ],
   "source": [
    "trained_ddpg = agent.train_model(model=model_ddpg, \n",
    "                             tb_log_name='ddpg',\n",
    "                             total_timesteps=50000) if if_using_ddpg else None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_gDkU-j-fCmZ"
   },
   "source": [
    "### Agent 3: PPO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "y5D5PFUhMzSV",
    "outputId": "01b7bbbb-7dce-4370-fe61-9098d4e5e978"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'n_steps': 2048, 'ent_coef': 0.01, 'learning_rate': 0.00025, 'batch_size': 128}\n",
      "Using cpu device\n",
      "Logging to results/ppo\n"
     ]
    }
   ],
   "source": [
    "agent = DRLAgent(env = env_train)\n",
    "PPO_PARAMS = {\n",
    "    \"n_steps\": 2048,\n",
    "    \"ent_coef\": 0.01,\n",
    "    \"learning_rate\": 0.00025,\n",
    "    \"batch_size\": 128,\n",
    "}\n",
    "model_ppo = agent.get_model(\"ppo\",model_kwargs = PPO_PARAMS)\n",
    "\n",
    "if if_using_ppo:\n",
    "  # set up logger\n",
    "  tmp_path = RESULTS_DIR + '/ppo'\n",
    "  new_logger_ppo = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n",
    "  # Set new logger\n",
    "  model_ppo.set_logger(new_logger_ppo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Gt8eIQKYM4G3",
    "outputId": "54235862-b58b-4bd0-db25-1c62931703e0"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------\n",
      "| time/              |           |\n",
      "|    fps             | 62        |\n",
      "|    iterations      | 1         |\n",
      "|    time_elapsed    | 32        |\n",
      "|    total_timesteps | 2048      |\n",
      "| train/             |           |\n",
      "|    reward          | 1.9690489 |\n",
      "----------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 61          |\n",
      "|    iterations           | 2           |\n",
      "|    time_elapsed         | 66          |\n",
      "|    total_timesteps      | 4096        |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.014264977 |\n",
      "|    clip_fraction        | 0.202       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.2       |\n",
      "|    explained_variance   | -0.0122     |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 6.85        |\n",
      "|    n_updates            | 10          |\n",
      "|    policy_gradient_loss | -0.0308     |\n",
      "|    reward               | -0.23267356 |\n",
      "|    std                  | 1           |\n",
      "|    value_loss           | 11.5        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 3           |\n",
      "|    time_elapsed         | 97          |\n",
      "|    total_timesteps      | 6144        |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.013272027 |\n",
      "|    clip_fraction        | 0.142       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.2       |\n",
      "|    explained_variance   | 0.00327     |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 18.8        |\n",
      "|    n_updates            | 20          |\n",
      "|    policy_gradient_loss | -0.021      |\n",
      "|    reward               | 2.0128894   |\n",
      "|    std                  | 1           |\n",
      "|    value_loss           | 35.3        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 63          |\n",
      "|    iterations           | 4           |\n",
      "|    time_elapsed         | 128         |\n",
      "|    total_timesteps      | 8192        |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.018971011 |\n",
      "|    clip_fraction        | 0.199       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.3       |\n",
      "|    explained_variance   | 0.0066      |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 24.8        |\n",
      "|    n_updates            | 30          |\n",
      "|    policy_gradient_loss | -0.0184     |\n",
      "|    reward               | 1.8397616   |\n",
      "|    std                  | 1.01        |\n",
      "|    value_loss           | 48.9        |\n",
      "-----------------------------------------\n",
      "----------------------------------------\n",
      "| time/                   |            |\n",
      "|    fps                  | 63         |\n",
      "|    iterations           | 5          |\n",
      "|    time_elapsed         | 162        |\n",
      "|    total_timesteps      | 10240      |\n",
      "| train/                  |            |\n",
      "|    approx_kl            | 0.01756508 |\n",
      "|    clip_fraction        | 0.21       |\n",
      "|    clip_range           | 0.2        |\n",
      "|    entropy_loss         | -41.3      |\n",
      "|    explained_variance   | -0.0379    |\n",
      "|    learning_rate        | 0.00025    |\n",
      "|    loss                 | 7.35       |\n",
      "|    n_updates            | 40         |\n",
      "|    policy_gradient_loss | -0.0276    |\n",
      "|    reward               | -1.9081799 |\n",
      "|    std                  | 1.01       |\n",
      "|    value_loss           | 16.1       |\n",
      "----------------------------------------\n",
      "day: 2956, episode: 40\n",
      "begin_total_asset: 1000000.00\n",
      "end_total_asset: 3774977.58\n",
      "total_reward: 2774977.58\n",
      "total_cost: 401887.21\n",
      "total_trades: 81671\n",
      "Sharpe: 0.753\n",
      "=================================\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 6           |\n",
      "|    time_elapsed         | 195         |\n",
      "|    total_timesteps      | 12288       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.026475038 |\n",
      "|    clip_fraction        | 0.283       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.4       |\n",
      "|    explained_variance   | 0.0106      |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 14          |\n",
      "|    n_updates            | 50          |\n",
      "|    policy_gradient_loss | -0.0221     |\n",
      "|    reward               | 0.057799082 |\n",
      "|    std                  | 1.01        |\n",
      "|    value_loss           | 46.2        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 7           |\n",
      "|    time_elapsed         | 228         |\n",
      "|    total_timesteps      | 14336       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.018429227 |\n",
      "|    clip_fraction        | 0.173       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.5       |\n",
      "|    explained_variance   | -0.00545    |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 39.2        |\n",
      "|    n_updates            | 60          |\n",
      "|    policy_gradient_loss | -0.0185     |\n",
      "|    reward               | 1.7880479   |\n",
      "|    std                  | 1.01        |\n",
      "|    value_loss           | 54.3        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 63          |\n",
      "|    iterations           | 8           |\n",
      "|    time_elapsed         | 260         |\n",
      "|    total_timesteps      | 16384       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.021180721 |\n",
      "|    clip_fraction        | 0.188       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.6       |\n",
      "|    explained_variance   | -0.0165     |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 9.84        |\n",
      "|    n_updates            | 70          |\n",
      "|    policy_gradient_loss | -0.0205     |\n",
      "|    reward               | -2.2737408  |\n",
      "|    std                  | 1.02        |\n",
      "|    value_loss           | 19.7        |\n",
      "-----------------------------------------\n",
      "----------------------------------------\n",
      "| time/                   |            |\n",
      "|    fps                  | 63         |\n",
      "|    iterations           | 9          |\n",
      "|    time_elapsed         | 292        |\n",
      "|    total_timesteps      | 18432      |\n",
      "| train/                  |            |\n",
      "|    approx_kl            | 0.02675029 |\n",
      "|    clip_fraction        | 0.242      |\n",
      "|    clip_range           | 0.2        |\n",
      "|    entropy_loss         | -41.6      |\n",
      "|    explained_variance   | -0.00406   |\n",
      "|    learning_rate        | 0.00025    |\n",
      "|    loss                 | 7.41       |\n",
      "|    n_updates            | 80         |\n",
      "|    policy_gradient_loss | -0.0204    |\n",
      "|    reward               | 0.98894453 |\n",
      "|    std                  | 1.02       |\n",
      "|    value_loss           | 40.6       |\n",
      "----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 10          |\n",
      "|    time_elapsed         | 326         |\n",
      "|    total_timesteps      | 20480       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.021093076 |\n",
      "|    clip_fraction        | 0.212       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.7       |\n",
      "|    explained_variance   | 0.00926     |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 19.7        |\n",
      "|    n_updates            | 90          |\n",
      "|    policy_gradient_loss | -0.022      |\n",
      "|    reward               | -1.6284031  |\n",
      "|    std                  | 1.02        |\n",
      "|    value_loss           | 39          |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 63          |\n",
      "|    iterations           | 11          |\n",
      "|    time_elapsed         | 355         |\n",
      "|    total_timesteps      | 22528       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.020121586 |\n",
      "|    clip_fraction        | 0.248       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.7       |\n",
      "|    explained_variance   | 0.000924    |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 14.8        |\n",
      "|    n_updates            | 100         |\n",
      "|    policy_gradient_loss | -0.0236     |\n",
      "|    reward               | 0.22854926  |\n",
      "|    std                  | 1.02        |\n",
      "|    value_loss           | 25.4        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 63          |\n",
      "|    iterations           | 12          |\n",
      "|    time_elapsed         | 389         |\n",
      "|    total_timesteps      | 24576       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.019215219 |\n",
      "|    clip_fraction        | 0.203       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.8       |\n",
      "|    explained_variance   | -0.00472    |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 6.42        |\n",
      "|    n_updates            | 110         |\n",
      "|    policy_gradient_loss | -0.0247     |\n",
      "|    reward               | 0.4193624   |\n",
      "|    std                  | 1.02        |\n",
      "|    value_loss           | 11.4        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 13          |\n",
      "|    time_elapsed         | 423         |\n",
      "|    total_timesteps      | 26624       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.0126833   |\n",
      "|    clip_fraction        | 0.134       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.8       |\n",
      "|    explained_variance   | 0.0292      |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 18.4        |\n",
      "|    n_updates            | 120         |\n",
      "|    policy_gradient_loss | -0.0163     |\n",
      "|    reward               | -0.13859338 |\n",
      "|    std                  | 1.02        |\n",
      "|    value_loss           | 38.3        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 14          |\n",
      "|    time_elapsed         | 457         |\n",
      "|    total_timesteps      | 28672       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.023029715 |\n",
      "|    clip_fraction        | 0.235       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.8       |\n",
      "|    explained_variance   | 0.0295      |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 14.6        |\n",
      "|    n_updates            | 130         |\n",
      "|    policy_gradient_loss | -0.0227     |\n",
      "|    reward               | 3.8744738   |\n",
      "|    std                  | 1.03        |\n",
      "|    value_loss           | 27          |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 63          |\n",
      "|    iterations           | 15          |\n",
      "|    time_elapsed         | 487         |\n",
      "|    total_timesteps      | 30720       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.024224166 |\n",
      "|    clip_fraction        | 0.202       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -41.9       |\n",
      "|    explained_variance   | 0.113       |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 4.35        |\n",
      "|    n_updates            | 140         |\n",
      "|    policy_gradient_loss | -0.0252     |\n",
      "|    reward               | -0.26325637 |\n",
      "|    std                  | 1.03        |\n",
      "|    value_loss           | 9.92        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 16          |\n",
      "|    time_elapsed         | 520         |\n",
      "|    total_timesteps      | 32768       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.018783428 |\n",
      "|    clip_fraction        | 0.209       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42         |\n",
      "|    explained_variance   | 0.0388      |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 15.6        |\n",
      "|    n_updates            | 150         |\n",
      "|    policy_gradient_loss | -0.0187     |\n",
      "|    reward               | 0.24681076  |\n",
      "|    std                  | 1.03        |\n",
      "|    value_loss           | 37.4        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 17          |\n",
      "|    time_elapsed         | 552         |\n",
      "|    total_timesteps      | 34816       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.024655312 |\n",
      "|    clip_fraction        | 0.299       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42         |\n",
      "|    explained_variance   | -0.007      |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 15.9        |\n",
      "|    n_updates            | 160         |\n",
      "|    policy_gradient_loss | -0.00996    |\n",
      "|    reward               | -1.8455201  |\n",
      "|    std                  | 1.03        |\n",
      "|    value_loss           | 40.9        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 18          |\n",
      "|    time_elapsed         | 586         |\n",
      "|    total_timesteps      | 36864       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.019520486 |\n",
      "|    clip_fraction        | 0.215       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42.1       |\n",
      "|    explained_variance   | -0.0287     |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 6.11        |\n",
      "|    n_updates            | 170         |\n",
      "|    policy_gradient_loss | -0.0251     |\n",
      "|    reward               | -3.1618273  |\n",
      "|    std                  | 1.03        |\n",
      "|    value_loss           | 9.79        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 63          |\n",
      "|    iterations           | 19          |\n",
      "|    time_elapsed         | 617         |\n",
      "|    total_timesteps      | 38912       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.027095716 |\n",
      "|    clip_fraction        | 0.244       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42.1       |\n",
      "|    explained_variance   | 0.0527      |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 6.31        |\n",
      "|    n_updates            | 180         |\n",
      "|    policy_gradient_loss | -0.022      |\n",
      "|    reward               | -0.55852425 |\n",
      "|    std                  | 1.03        |\n",
      "|    value_loss           | 17.3        |\n",
      "-----------------------------------------\n",
      "----------------------------------------\n",
      "| time/                   |            |\n",
      "|    fps                  | 62         |\n",
      "|    iterations           | 20         |\n",
      "|    time_elapsed         | 651        |\n",
      "|    total_timesteps      | 40960      |\n",
      "| train/                  |            |\n",
      "|    approx_kl            | 0.02232542 |\n",
      "|    clip_fraction        | 0.244      |\n",
      "|    clip_range           | 0.2        |\n",
      "|    entropy_loss         | -42.2      |\n",
      "|    explained_variance   | -0.0103    |\n",
      "|    learning_rate        | 0.00025    |\n",
      "|    loss                 | 14.8       |\n",
      "|    n_updates            | 190        |\n",
      "|    policy_gradient_loss | -0.0244    |\n",
      "|    reward               | -2.0887594 |\n",
      "|    std                  | 1.04       |\n",
      "|    value_loss           | 29.7       |\n",
      "----------------------------------------\n",
      "day: 2956, episode: 50\n",
      "begin_total_asset: 1000000.00\n",
      "end_total_asset: 2970639.96\n",
      "total_reward: 1970639.96\n",
      "total_cost: 343994.69\n",
      "total_trades: 77702\n",
      "Sharpe: 0.613\n",
      "=================================\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 21          |\n",
      "|    time_elapsed         | 685         |\n",
      "|    total_timesteps      | 43008       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.030464383 |\n",
      "|    clip_fraction        | 0.316       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42.2       |\n",
      "|    explained_variance   | 0.11        |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 3.84        |\n",
      "|    n_updates            | 200         |\n",
      "|    policy_gradient_loss | -0.0163     |\n",
      "|    reward               | -0.31706023 |\n",
      "|    std                  | 1.04        |\n",
      "|    value_loss           | 9.59        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 22          |\n",
      "|    time_elapsed         | 718         |\n",
      "|    total_timesteps      | 45056       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.025304668 |\n",
      "|    clip_fraction        | 0.254       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42.3       |\n",
      "|    explained_variance   | -0.0297     |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 8.7         |\n",
      "|    n_updates            | 210         |\n",
      "|    policy_gradient_loss | -0.0209     |\n",
      "|    reward               | -0.2382796  |\n",
      "|    std                  | 1.04        |\n",
      "|    value_loss           | 20.4        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 23          |\n",
      "|    time_elapsed         | 748         |\n",
      "|    total_timesteps      | 47104       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.026483834 |\n",
      "|    clip_fraction        | 0.287       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42.3       |\n",
      "|    explained_variance   | -0.00439    |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 9.91        |\n",
      "|    n_updates            | 220         |\n",
      "|    policy_gradient_loss | -0.0269     |\n",
      "|    reward               | -1.159043   |\n",
      "|    std                  | 1.04        |\n",
      "|    value_loss           | 15.5        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 24          |\n",
      "|    time_elapsed         | 781         |\n",
      "|    total_timesteps      | 49152       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.027692135 |\n",
      "|    clip_fraction        | 0.298       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42.4       |\n",
      "|    explained_variance   | -0.00753    |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 9.84        |\n",
      "|    n_updates            | 230         |\n",
      "|    policy_gradient_loss | -0.0194     |\n",
      "|    reward               | 0.2796967   |\n",
      "|    std                  | 1.04        |\n",
      "|    value_loss           | 14.8        |\n",
      "-----------------------------------------\n",
      "-----------------------------------------\n",
      "| time/                   |             |\n",
      "|    fps                  | 62          |\n",
      "|    iterations           | 25          |\n",
      "|    time_elapsed         | 814         |\n",
      "|    total_timesteps      | 51200       |\n",
      "| train/                  |             |\n",
      "|    approx_kl            | 0.023373984 |\n",
      "|    clip_fraction        | 0.229       |\n",
      "|    clip_range           | 0.2         |\n",
      "|    entropy_loss         | -42.4       |\n",
      "|    explained_variance   | 0.0275      |\n",
      "|    learning_rate        | 0.00025     |\n",
      "|    loss                 | 3.9         |\n",
      "|    n_updates            | 240         |\n",
      "|    policy_gradient_loss | -0.0242     |\n",
      "|    reward               | 1.1403084   |\n",
      "|    std                  | 1.05        |\n",
      "|    value_loss           | 8.83        |\n",
      "-----------------------------------------\n"
     ]
    }
   ],
   "source": [
    "trained_ppo = agent.train_model(model=model_ppo, \n",
    "                             tb_log_name='ppo',\n",
    "                             total_timesteps=50000) if if_using_ppo else None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "3Zpv4S0-fDBv"
   },
   "source": [
    "### Agent 4: TD3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "JSAHhV4Xc-bh",
    "outputId": "b0762c2c-09b6-4351-876a-59cd08be4707"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'batch_size': 100, 'buffer_size': 1000000, 'learning_rate': 0.001}\n",
      "Using cpu device\n",
      "Logging to results/td3\n"
     ]
    }
   ],
   "source": [
    "agent = DRLAgent(env = env_train)\n",
    "TD3_PARAMS = {\"batch_size\": 100, \n",
    "              \"buffer_size\": 1000000, \n",
    "              \"learning_rate\": 0.001}\n",
    "\n",
    "model_td3 = agent.get_model(\"td3\",model_kwargs = TD3_PARAMS)\n",
    "\n",
    "if if_using_td3:\n",
    "  # set up logger\n",
    "  tmp_path = RESULTS_DIR + '/td3'\n",
    "  new_logger_td3 = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n",
    "  # Set new logger\n",
    "  model_td3.set_logger(new_logger_td3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "OSRxNYAxdKpU",
    "outputId": "31b518ef-3966-413c-89f9-d83a037e55b4"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 4          |\n",
      "|    fps             | 24         |\n",
      "|    time_elapsed    | 485        |\n",
      "|    total_timesteps | 11828      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | -18.2      |\n",
      "|    critic_loss     | 3.05e+03   |\n",
      "|    learning_rate   | 0.001      |\n",
      "|    n_updates       | 8871       |\n",
      "|    reward          | -5.4769893 |\n",
      "-----------------------------------\n",
      "day: 2956, episode: 60\n",
      "begin_total_asset: 1000000.00\n",
      "end_total_asset: 3288091.49\n",
      "total_reward: 2288091.49\n",
      "total_cost: 1185.23\n",
      "total_trades: 59158\n",
      "Sharpe: 0.619\n",
      "=================================\n",
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 8          |\n",
      "|    fps             | 21         |\n",
      "|    time_elapsed    | 1092       |\n",
      "|    total_timesteps | 23656      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | 9.12       |\n",
      "|    critic_loss     | 83.9       |\n",
      "|    learning_rate   | 0.001      |\n",
      "|    n_updates       | 20699      |\n",
      "|    reward          | -5.4769893 |\n",
      "-----------------------------------\n",
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 12         |\n",
      "|    fps             | 20         |\n",
      "|    time_elapsed    | 1711       |\n",
      "|    total_timesteps | 35484      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | 12.4       |\n",
      "|    critic_loss     | 6.69       |\n",
      "|    learning_rate   | 0.001      |\n",
      "|    n_updates       | 32527      |\n",
      "|    reward          | -5.4769893 |\n",
      "-----------------------------------\n",
      "day: 2956, episode: 70\n",
      "begin_total_asset: 1000000.00\n",
      "end_total_asset: 3288091.49\n",
      "total_reward: 2288091.49\n",
      "total_cost: 1185.23\n",
      "total_trades: 59158\n",
      "Sharpe: 0.619\n",
      "=================================\n",
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 16         |\n",
      "|    fps             | 20         |\n",
      "|    time_elapsed    | 2337       |\n",
      "|    total_timesteps | 47312      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | 15.4       |\n",
      "|    critic_loss     | 22         |\n",
      "|    learning_rate   | 0.001      |\n",
      "|    n_updates       | 44355      |\n",
      "|    reward          | -5.4769893 |\n",
      "-----------------------------------\n"
     ]
    }
   ],
   "source": [
    "trained_td3 = agent.train_model(model=model_td3, \n",
    "                             tb_log_name='td3',\n",
    "                             total_timesteps=50000) if if_using_td3 else None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Dr49PotrfG01"
   },
   "source": [
    "### Agent 5: SAC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "xwOhVjqRkCdM",
    "outputId": "a5ebf4e2-34ca-4bf5-8980-08d37a0659e0"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'batch_size': 128, 'buffer_size': 100000, 'learning_rate': 0.0001, 'learning_starts': 100, 'ent_coef': 'auto_0.1'}\n",
      "Using cpu device\n",
      "Logging to results/sac\n"
     ]
    }
   ],
   "source": [
    "agent = DRLAgent(env = env_train)\n",
    "SAC_PARAMS = {\n",
    "    \"batch_size\": 128,\n",
    "    \"buffer_size\": 100000,\n",
    "    \"learning_rate\": 0.0001,\n",
    "    \"learning_starts\": 100,\n",
    "    \"ent_coef\": \"auto_0.1\",\n",
    "}\n",
    "\n",
    "model_sac = agent.get_model(\"sac\",model_kwargs = SAC_PARAMS)\n",
    "\n",
    "if if_using_sac:\n",
    "  # set up logger\n",
    "  tmp_path = RESULTS_DIR + '/sac'\n",
    "  new_logger_sac = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n",
    "  # Set new logger\n",
    "  model_sac.set_logger(new_logger_sac)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "K8RSdKCckJyH",
    "outputId": "7f1e46f5-7124-4b6d-8fe7-f8071760cfe5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 4          |\n",
      "|    fps             | 19         |\n",
      "|    time_elapsed    | 599        |\n",
      "|    total_timesteps | 11828      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | 267        |\n",
      "|    critic_loss     | 20.6       |\n",
      "|    ent_coef        | 0.0815     |\n",
      "|    ent_coef_loss   | -114       |\n",
      "|    learning_rate   | 0.0001     |\n",
      "|    n_updates       | 11727      |\n",
      "|    reward          | -3.5861566 |\n",
      "-----------------------------------\n",
      "day: 2956, episode: 80\n",
      "begin_total_asset: 1000000.00\n",
      "end_total_asset: 3861827.22\n",
      "total_reward: 2861827.22\n",
      "total_cost: 18573.40\n",
      "total_trades: 51384\n",
      "Sharpe: 0.753\n",
      "=================================\n",
      "----------------------------------\n",
      "| time/              |           |\n",
      "|    episodes        | 8         |\n",
      "|    fps             | 19        |\n",
      "|    time_elapsed    | 1215      |\n",
      "|    total_timesteps | 23656     |\n",
      "| train/             |           |\n",
      "|    actor_loss      | 105       |\n",
      "|    critic_loss     | 28.3      |\n",
      "|    ent_coef        | 0.0251    |\n",
      "|    ent_coef_loss   | -160      |\n",
      "|    learning_rate   | 0.0001    |\n",
      "|    n_updates       | 23555     |\n",
      "|    reward          | -3.716044 |\n",
      "----------------------------------\n",
      "----------------------------------\n",
      "| time/              |           |\n",
      "|    episodes        | 12        |\n",
      "|    fps             | 19        |\n",
      "|    time_elapsed    | 1838      |\n",
      "|    total_timesteps | 35484     |\n",
      "| train/             |           |\n",
      "|    actor_loss      | 49.8      |\n",
      "|    critic_loss     | 37.6      |\n",
      "|    ent_coef        | 0.00776   |\n",
      "|    ent_coef_loss   | -193      |\n",
      "|    learning_rate   | 0.0001    |\n",
      "|    n_updates       | 35383     |\n",
      "|    reward          | -4.683935 |\n",
      "----------------------------------\n",
      "-----------------------------------\n",
      "| time/              |            |\n",
      "|    episodes        | 16         |\n",
      "|    fps             | 19         |\n",
      "|    time_elapsed    | 2468       |\n",
      "|    total_timesteps | 47312      |\n",
      "| train/             |            |\n",
      "|    actor_loss      | 31.3       |\n",
      "|    critic_loss     | 2.79       |\n",
      "|    ent_coef        | 0.00247    |\n",
      "|    ent_coef_loss   | -155       |\n",
      "|    learning_rate   | 0.0001     |\n",
      "|    n_updates       | 47211      |\n",
      "|    reward          | -3.3984547 |\n",
      "-----------------------------------\n"
     ]
    }
   ],
   "source": [
    "trained_sac = agent.train_model(model=model_sac, \n",
    "                             tb_log_name='sac',\n",
    "                             total_timesteps=50000) if if_using_sac else None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "f2wZgkQXh1jE"
   },
   "source": [
    "## In-sample Performance\n",
    "\n",
    "Assume that the initial capital is $1,000,000."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bEv5KGC8h1jE"
   },
   "source": [
    "### Set turbulence threshold\n",
    "Set the turbulence threshold to be greater than the maximum of insample turbulence data. If current turbulence index is greater than the threshold, then we assume that the current market is volatile"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "id": "efwBi84ch1jE"
   },
   "outputs": [],
   "source": [
    "data_risk_indicator = processed_full[(processed_full.date<TRAIN_END_DATE) & (processed_full.date>=TRAIN_START_DATE)]\n",
    "insample_risk_indicator = data_risk_indicator.drop_duplicates(subset=['date'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "VHZMBpSqh1jG",
    "outputId": "ffa57923-17e2-436e-c970-fcc52112a098"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    2957.000000\n",
       "mean       18.105293\n",
       "std         7.272476\n",
       "min         9.140000\n",
       "25%        13.370000\n",
       "50%        16.209999\n",
       "75%        20.629999\n",
       "max        82.690002\n",
       "Name: vix, dtype: float64"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "insample_risk_indicator.vix.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "BDkszkMloRWT",
    "outputId": "7c539b2c-6223-4d00-d571-7af992f976bf"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57.212001831054636"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "insample_risk_indicator.vix.quantile(0.996)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "AL7hs7svnNWT",
    "outputId": "6510973a-cfd3-4ff8-f482-287ac99de05c"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    2957.000000\n",
       "mean       34.139586\n",
       "std        43.879103\n",
       "min         0.000000\n",
       "25%        14.613449\n",
       "50%        23.644963\n",
       "75%        38.292666\n",
       "max       652.505968\n",
       "Name: turbulence, dtype: float64"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "insample_risk_indicator.turbulence.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "N78hfHckoqJ9",
    "outputId": "7258129e-a14b-4327-cb7e-f7cfb73b3dd0"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "291.7261025697854"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "insample_risk_indicator.turbulence.quantile(0.996)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "U5mmgQF_h1jQ"
   },
   "source": [
    "### Trading (Out-of-sample Performance)\n",
    "\n",
    "We update periodically in order to take full advantage of the data, e.g., retrain quarterly, monthly or weekly. We also tune the parameters along the way, in this notebook we use the in-sample data from 2009-01 to 2020-07 to tune the parameters once, so there is some alpha decay here as the length of trade date extends. \n",
    "\n",
    "Numerous hyperparameters – e.g. the learning rate, the total number of samples to train on – influence the learning process and are usually determined by testing some variations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "id": "cIqoV0GSI52v"
   },
   "outputs": [],
   "source": [
    "e_trade_gym = StockTradingEnv(df = trade, turbulence_threshold = 70,risk_indicator_col='vix', **env_kwargs)\n",
    "# env_trade, obs_trade = e_trade_gym.get_sb_env()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 357
    },
    "id": "W_XNgGsBMeVw",
    "outputId": "37dba890-811e-4c0c-fee9-f12f3f9eb100"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-fede4fa5-c07d-4b25-bc95-525a3a2500e1\">\n",
       "    <div class=\"colab-df-container\">\n",
       "      <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>tic</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>day</th>\n",
       "      <th>macd</th>\n",
       "      <th>boll_ub</th>\n",
       "      <th>boll_lb</th>\n",
       "      <th>rsi_30</th>\n",
       "      <th>cci_30</th>\n",
       "      <th>dx_30</th>\n",
       "      <th>close_30_sma</th>\n",
       "      <th>close_60_sma</th>\n",
       "      <th>vix</th>\n",
       "      <th>turbulence</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>141.899994</td>\n",
       "      <td>142.919998</td>\n",
       "      <td>139.110001</td>\n",
       "      <td>141.404266</td>\n",
       "      <td>94639600.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>-1.703487</td>\n",
       "      <td>155.382845</td>\n",
       "      <td>137.132192</td>\n",
       "      <td>46.927735</td>\n",
       "      <td>-142.190143</td>\n",
       "      <td>41.749873</td>\n",
       "      <td>147.171798</td>\n",
       "      <td>146.269416</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>AMGN</td>\n",
       "      <td>213.589996</td>\n",
       "      <td>214.610001</td>\n",
       "      <td>210.800003</td>\n",
       "      <td>203.845886</td>\n",
       "      <td>2629400.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>-3.097331</td>\n",
       "      <td>212.767983</td>\n",
       "      <td>199.379593</td>\n",
       "      <td>40.408568</td>\n",
       "      <td>-96.756949</td>\n",
       "      <td>36.189244</td>\n",
       "      <td>208.480831</td>\n",
       "      <td>217.103342</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>AXP</td>\n",
       "      <td>168.500000</td>\n",
       "      <td>175.119995</td>\n",
       "      <td>168.479996</td>\n",
       "      <td>170.695389</td>\n",
       "      <td>3956000.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.281748</td>\n",
       "      <td>174.864263</td>\n",
       "      <td>149.785746</td>\n",
       "      <td>56.265103</td>\n",
       "      <td>117.565552</td>\n",
       "      <td>15.667511</td>\n",
       "      <td>161.812905</td>\n",
       "      <td>164.064442</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>BA</td>\n",
       "      <td>222.850006</td>\n",
       "      <td>226.720001</td>\n",
       "      <td>220.600006</td>\n",
       "      <td>226.000000</td>\n",
       "      <td>9113600.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.730320</td>\n",
       "      <td>226.909442</td>\n",
       "      <td>205.727561</td>\n",
       "      <td>51.614047</td>\n",
       "      <td>116.649440</td>\n",
       "      <td>2.027170</td>\n",
       "      <td>217.175334</td>\n",
       "      <td>221.968500</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-10-01</td>\n",
       "      <td>CAT</td>\n",
       "      <td>192.899994</td>\n",
       "      <td>195.869995</td>\n",
       "      <td>191.240005</td>\n",
       "      <td>187.928040</td>\n",
       "      <td>3695500.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>-3.640323</td>\n",
       "      <td>205.735917</td>\n",
       "      <td>181.432778</td>\n",
       "      <td>41.999441</td>\n",
       "      <td>-112.087750</td>\n",
       "      <td>36.203176</td>\n",
       "      <td>196.993865</td>\n",
       "      <td>200.522105</td>\n",
       "      <td>21.1</td>\n",
       "      <td>120.122917</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-fede4fa5-c07d-4b25-bc95-525a3a2500e1')\"\n",
       "              title=\"Convert this dataframe to an interactive table.\"\n",
       "              style=\"display:none;\">\n",
       "        \n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
       "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
       "  </svg>\n",
       "      </button>\n",
       "      \n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      flex-wrap:wrap;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "      <script>\n",
       "        const buttonEl =\n",
       "          document.querySelector('#df-fede4fa5-c07d-4b25-bc95-525a3a2500e1 button.colab-df-convert');\n",
       "        buttonEl.style.display =\n",
       "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "        async function convertToInteractive(key) {\n",
       "          const element = document.querySelector('#df-fede4fa5-c07d-4b25-bc95-525a3a2500e1');\n",
       "          const dataTable =\n",
       "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                     [key], {});\n",
       "          if (!dataTable) return;\n",
       "\n",
       "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "            + ' to learn more about interactive tables.';\n",
       "          element.innerHTML = '';\n",
       "          dataTable['output_type'] = 'display_data';\n",
       "          await google.colab.output.renderOutput(dataTable, element);\n",
       "          const docLink = document.createElement('div');\n",
       "          docLink.innerHTML = docLinkHtml;\n",
       "          element.appendChild(docLink);\n",
       "        }\n",
       "      </script>\n",
       "    </div>\n",
       "  </div>\n",
       "  "
      ],
      "text/plain": [
       "         date   tic        open        high         low       close  \\\n",
       "0  2021-10-01  AAPL  141.899994  142.919998  139.110001  141.404266   \n",
       "0  2021-10-01  AMGN  213.589996  214.610001  210.800003  203.845886   \n",
       "0  2021-10-01   AXP  168.500000  175.119995  168.479996  170.695389   \n",
       "0  2021-10-01    BA  222.850006  226.720001  220.600006  226.000000   \n",
       "0  2021-10-01   CAT  192.899994  195.869995  191.240005  187.928040   \n",
       "\n",
       "       volume  day      macd     boll_ub     boll_lb     rsi_30      cci_30  \\\n",
       "0  94639600.0  4.0 -1.703487  155.382845  137.132192  46.927735 -142.190143   \n",
       "0   2629400.0  4.0 -3.097331  212.767983  199.379593  40.408568  -96.756949   \n",
       "0   3956000.0  4.0  2.281748  174.864263  149.785746  56.265103  117.565552   \n",
       "0   9113600.0  4.0  0.730320  226.909442  205.727561  51.614047  116.649440   \n",
       "0   3695500.0  4.0 -3.640323  205.735917  181.432778  41.999441 -112.087750   \n",
       "\n",
       "       dx_30  close_30_sma  close_60_sma   vix  turbulence  \n",
       "0  41.749873    147.171798    146.269416  21.1  120.122917  \n",
       "0  36.189244    208.480831    217.103342  21.1  120.122917  \n",
       "0  15.667511    161.812905    164.064442  21.1  120.122917  \n",
       "0   2.027170    217.175334    221.968500  21.1  120.122917  \n",
       "0  36.203176    196.993865    200.522105  21.1  120.122917  "
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trade.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "lbFchno5j3xs",
    "outputId": "7eb7fa24-50a8-4506-97bf-a463e66f9102"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hit end!\n"
     ]
    }
   ],
   "source": [
    "trained_moedl = trained_a2c\n",
    "df_account_value_a2c, df_actions_a2c = DRLAgent.DRL_prediction(\n",
    "    model=trained_moedl, \n",
    "    environment = e_trade_gym)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "JbYljWGjj3pH",
    "outputId": "3e682898-d5a5-4664-9469-77b6029cc277"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hit end!\n"
     ]
    }
   ],
   "source": [
    "trained_moedl = trained_ddpg\n",
    "df_account_value_ddpg, df_actions_ddpg = DRLAgent.DRL_prediction(\n",
    "    model=trained_moedl, \n",
    "    environment = e_trade_gym)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "74jNP2DBj3hb",
    "outputId": "d5f85887-a738-4699-e886-77d2225dd7eb"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hit end!\n"
     ]
    }
   ],
   "source": [
    "trained_moedl = trained_ppo\n",
    "df_account_value_ppo, df_actions_ppo = DRLAgent.DRL_prediction(\n",
    "    model=trained_moedl, \n",
    "    environment = e_trade_gym)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "S7VyGGJPj3SH",
    "outputId": "10165564-7775-4358-c137-7c4ae646df6c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hit end!\n"
     ]
    }
   ],
   "source": [
    "trained_moedl = trained_td3\n",
    "df_account_value_td3, df_actions_td3 = DRLAgent.DRL_prediction(\n",
    "    model=trained_moedl, \n",
    "    environment = e_trade_gym)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "eLOnL5eYh1jR",
    "outputId": "6bdc3498-93b4-42ea-82ff-47ef9e99329c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hit end!\n"
     ]
    }
   ],
   "source": [
    "trained_moedl = trained_sac\n",
    "df_account_value_sac, df_actions_sac = DRLAgent.DRL_prediction(\n",
    "    model=trained_moedl, \n",
    "    environment = e_trade_gym)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ERxw3KqLkcP4",
    "outputId": "52dbeacc-617a-4553-d4a9-8692b988a240"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(353, 2)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_account_value_a2c.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GcE-t08w6DaW"
   },
   "source": [
    "<a id='7'></a>\n",
    "# Part 6.5: Mean Variance Optimization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "_b1vKXKgSe4G",
    "outputId": "35956c2d-8251-468d-ca1c-81e73aa772a1"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-08fc3e0c-561b-4278-841b-51276ed0be48\">\n",
       "    <div class=\"colab-df-container\">\n",
       "      <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>tic</th>\n",
       "      <th>close</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>AAPL</td>\n",
       "      <td>6.505280</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>AMGN</td>\n",
       "      <td>42.888943</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>AXP</td>\n",
       "      <td>33.675961</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>BA</td>\n",
       "      <td>43.777538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2010-01-04</td>\n",
       "      <td>CAT</td>\n",
       "      <td>41.156910</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-08fc3e0c-561b-4278-841b-51276ed0be48')\"\n",
       "              title=\"Convert this dataframe to an interactive table.\"\n",
       "              style=\"display:none;\">\n",
       "        \n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
       "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
       "  </svg>\n",
       "      </button>\n",
       "      \n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      flex-wrap:wrap;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "      <script>\n",
       "        const buttonEl =\n",
       "          document.querySelector('#df-08fc3e0c-561b-4278-841b-51276ed0be48 button.colab-df-convert');\n",
       "        buttonEl.style.display =\n",
       "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "        async function convertToInteractive(key) {\n",
       "          const element = document.querySelector('#df-08fc3e0c-561b-4278-841b-51276ed0be48');\n",
       "          const dataTable =\n",
       "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                     [key], {});\n",
       "          if (!dataTable) return;\n",
       "\n",
       "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "            + ' to learn more about interactive tables.';\n",
       "          element.innerHTML = '';\n",
       "          dataTable['output_type'] = 'display_data';\n",
       "          await google.colab.output.renderOutput(dataTable, element);\n",
       "          const docLink = document.createElement('div');\n",
       "          docLink.innerHTML = docLinkHtml;\n",
       "          element.appendChild(docLink);\n",
       "        }\n",
       "      </script>\n",
       "    </div>\n",
       "  </div>\n",
       "  "
      ],
      "text/plain": [
       "         date   tic      close\n",
       "0  2010-01-04  AAPL   6.505280\n",
       "1  2010-01-04  AMGN  42.888943\n",
       "2  2010-01-04   AXP  33.675961\n",
       "3  2010-01-04    BA  43.777538\n",
       "4  2010-01-04   CAT  41.156910"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mvo_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "id": "fE2YWB0WBDVu"
   },
   "outputs": [],
   "source": [
    "fst = mvo_df\n",
    "fst = fst.iloc[0*29:0*29+29, :]\n",
    "tic = fst['tic'].tolist()\n",
    "\n",
    "mvo = pd.DataFrame()\n",
    "\n",
    "for k in range(len(tic)):\n",
    "  mvo[tic[k]] = 0\n",
    "\n",
    "for i in range(mvo_df.shape[0]//29):\n",
    "  n = mvo_df\n",
    "  n = n.iloc[i*29:i*29+29, :]\n",
    "  date = n['date'][i*29]\n",
    "  mvo.loc[date] = n['close'].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "9K2xfyh_VcXo",
    "outputId": "9a16e998-4e75-4d1f-e83d-a0346d3e7463"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3310"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mvo.shape[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "SwEwkHJ1d_6u"
   },
   "source": [
    "### Helper functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "id": "kayNWPWn6Kz2"
   },
   "outputs": [],
   "source": [
    "from scipy import optimize \n",
    "from scipy.optimize import linprog\n",
    "\n",
    "#function obtains maximal return portfolio using linear programming\n",
    "\n",
    "def MaximizeReturns(MeanReturns, PortfolioSize):\n",
    "    \n",
    "  #dependencies\n",
    "  \n",
    "    \n",
    "  c = (np.multiply(-1, MeanReturns))\n",
    "  A = np.ones([PortfolioSize,1]).T\n",
    "  b=[1]\n",
    "  res = linprog(c, A_ub = A, b_ub = b, bounds = (0,1), method = 'simplex') \n",
    "    \n",
    "  return res\n",
    "\n",
    "def MinimizeRisk(CovarReturns, PortfolioSize):\n",
    "    \n",
    "  def f(x, CovarReturns):\n",
    "    func = np.matmul(np.matmul(x, CovarReturns), x.T) \n",
    "    return func\n",
    "\n",
    "  def constraintEq(x):\n",
    "    A=np.ones(x.shape)\n",
    "    b=1\n",
    "    constraintVal = np.matmul(A,x.T)-b \n",
    "    return constraintVal\n",
    "    \n",
    "  xinit=np.repeat(0.1, PortfolioSize)\n",
    "  cons = ({'type': 'eq', 'fun':constraintEq})\n",
    "  lb = 0\n",
    "  ub = 1\n",
    "  bnds = tuple([(lb,ub) for x in xinit])\n",
    "\n",
    "  opt = optimize.minimize (f, x0 = xinit, args = (CovarReturns),  bounds = bnds, \\\n",
    "                             constraints = cons, tol = 10**-3)\n",
    "    \n",
    "  return opt\n",
    "\n",
    "def MinimizeRiskConstr(MeanReturns, CovarReturns, PortfolioSize, R):\n",
    "    \n",
    "  def  f(x,CovarReturns):\n",
    "         \n",
    "    func = np.matmul(np.matmul(x,CovarReturns ), x.T)\n",
    "    return func\n",
    "\n",
    "  def constraintEq(x):\n",
    "    AEq=np.ones(x.shape)\n",
    "    bEq=1\n",
    "    EqconstraintVal = np.matmul(AEq,x.T)-bEq \n",
    "    return EqconstraintVal\n",
    "    \n",
    "  def constraintIneq(x, MeanReturns, R):\n",
    "    AIneq = np.array(MeanReturns)\n",
    "    bIneq = R\n",
    "    IneqconstraintVal = np.matmul(AIneq,x.T) - bIneq\n",
    "    return IneqconstraintVal\n",
    "    \n",
    "\n",
    "  xinit=np.repeat(0.1, PortfolioSize)\n",
    "  cons = ({'type': 'eq', 'fun':constraintEq},\n",
    "          {'type':'ineq', 'fun':constraintIneq, 'args':(MeanReturns,R) })\n",
    "  lb = 0\n",
    "  ub = 1\n",
    "  bnds = tuple([(lb,ub) for x in xinit])\n",
    "\n",
    "  opt = optimize.minimize (f, args = (CovarReturns), method ='trust-constr',  \\\n",
    "                x0 = xinit,   bounds = bnds, constraints = cons, tol = 10**-3)\n",
    "    \n",
    "  return opt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "id": "6KvXkpyE8MFq"
   },
   "outputs": [],
   "source": [
    "def StockReturnsComputing(StockPrice, Rows, Columns): \n",
    "  import numpy as np \n",
    "  StockReturn = np.zeros([Rows-1, Columns]) \n",
    "  for j in range(Columns):        # j: Assets \n",
    "    for i in range(Rows-1):     # i: Daily Prices \n",
    "      StockReturn[i,j]=((StockPrice[i+1, j]-StockPrice[i,j])/StockPrice[i,j])* 100 \n",
    "      \n",
    "  return StockReturn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "IeVVbuwveJ_5"
   },
   "source": [
    "### Calculate mean returns and variance-covariance matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Q2G1phEm_Ut3",
    "outputId": "ce7c4d13-3adf-47d2-dfe1-0574637e94c3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[148.01602173, 198.85264587, 178.01608276, ...,  49.54628372,\n",
       "         45.13446426, 145.86064148],\n",
       "       [147.55015564, 196.85154724, 175.14341736, ...,  49.12624359,\n",
       "         44.02268982, 144.66435242],\n",
       "       [151.23765564, 197.41375732, 171.77888489, ...,  49.28492355,\n",
       "         44.00400162, 145.56646729],\n",
       "       ...,\n",
       "       [149.3999939 , 237.61999512, 175.13999939, ...,  38.52999878,\n",
       "         36.20999908, 142.08999634],\n",
       "       [146.71000671, 233.66000366, 174.25      , ...,  38.74000168,\n",
       "         35.79999924, 142.47000122],\n",
       "       [147.91999817, 234.44999695, 173.30000305, ...,  38.88000107,\n",
       "         35.38999939, 141.44000244]])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Obtain optimal portfolio sets that maximize return and minimize risk\n",
    "\n",
    "#Dependencies\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "\n",
    "#input k-portfolio 1 dataset comprising 15 stocks\n",
    "# StockFileName = './DJIA_Apr112014_Apr112019_kpf1.csv'\n",
    "\n",
    "Rows = 1259  #excluding header\n",
    "Columns = 15  #excluding date\n",
    "portfolioSize = 29 #set portfolio size\n",
    "\n",
    "#read stock prices in a dataframe\n",
    "# df = pd.read_csv(StockFileName,  nrows= Rows)\n",
    "\n",
    "#extract asset labels\n",
    "# assetLabels = df.columns[1:Columns+1].tolist()\n",
    "# print(assetLabels)\n",
    "\n",
    "#extract asset prices\n",
    "# StockData = df.iloc[0:, 1:]\n",
    "StockData = mvo.head(mvo.shape[0]-336)\n",
    "TradeData = mvo.tail(336)\n",
    "# df.head()\n",
    "TradeData.to_numpy()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "u6_O6vrn_uD4",
    "outputId": "f41663c0-db5b-4154-a801-924050e1813b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean returns of assets in k-portfolio 1\n",
      " [0.121 0.063 0.073 0.078 0.069 0.118 0.052 0.043 0.073 0.052 0.106 0.078\n",
      " 0.022 0.057 0.049 0.073 0.04  0.063 0.046 0.05  0.098 0.096 0.046 0.059\n",
      " 0.109 0.095 0.042 0.035 0.051]\n",
      "Variance-Covariance matrix of returns\n",
      " [[3.128 1.014 1.29  1.521 1.371 1.689 1.375 1.125 1.088 1.374 1.163 1.221\n",
      "  1.03  1.525 0.692 1.269 0.664 0.816 1.029 0.733 1.576 1.139 0.668 0.86\n",
      "  1.144 1.338 0.525 0.908 0.635]\n",
      " [1.014 2.4   1.072 1.01  1.066 1.211 1.025 0.965 0.937 1.122 0.978 1.029\n",
      "  0.851 1.153 0.891 1.14  0.641 0.664 0.906 1.072 1.088 0.873 0.724 0.854\n",
      "  1.146 1.056 0.631 1.025 0.645]\n",
      " [1.29  1.072 3.315 2.475 1.907 1.568 1.428 1.922 1.715 2.237 1.376 1.847\n",
      "  1.343 1.508 0.861 2.37  0.99  1.075 1.375 0.964 1.357 1.418 0.728 1.505\n",
      "  1.417 1.8   0.748 1.216 0.584]\n",
      " [1.521 1.01  2.475 4.962 2.117 1.687 1.511 2.143 1.838 2.201 1.527 2.121\n",
      "  1.532 1.699 0.905 2.296 1.117 1.195 1.461 0.949 1.437 1.573 0.748 1.604\n",
      "  1.472 1.716 0.734 1.362 0.603]\n",
      " [1.371 1.066 1.907 2.117 3.331 1.613 1.519 1.887 1.471 1.998 1.239 1.868\n",
      "  1.355 1.566 0.826 2.039 0.848 0.855 1.585 0.918 1.331 1.292 0.682 1.269\n",
      "  1.221 1.408 0.739 1.226 0.613]\n",
      " [1.689 1.211 1.568 1.687 1.613 5.041 1.65  1.257 1.352 1.604 1.358 1.44\n",
      "  1.185 1.637 0.756 1.564 0.738 0.984 1.151 0.91  1.853 1.493 0.657 1.042\n",
      "  1.204 1.722 0.563 1.017 0.621]\n",
      " [1.375 1.025 1.428 1.511 1.519 1.65  2.796 1.303 1.264 1.5   1.133 1.355\n",
      "  1.245 1.583 0.843 1.511 0.728 0.823 1.215 0.881 1.481 1.145 0.74  1.002\n",
      "  1.098 1.31  0.655 1.065 0.686]\n",
      " [1.125 0.965 1.922 2.143 1.887 1.257 1.303 2.92  1.389 1.826 1.201 1.64\n",
      "  1.275 1.386 0.836 1.942 0.919 0.993 1.263 0.963 1.203 1.136 0.686 1.361\n",
      "  1.296 1.381 0.74  1.06  0.518]\n",
      " [1.088 0.937 1.715 1.838 1.471 1.352 1.264 1.389 2.458 1.614 1.152 1.464\n",
      "  1.058 1.228 0.701 1.68  0.829 0.863 1.117 0.775 1.15  1.197 0.663 1.097\n",
      "  1.058 1.313 0.66  0.994 0.574]\n",
      " [1.374 1.122 2.237 2.201 1.998 1.604 1.5   1.826 1.614 3.375 1.351 1.724\n",
      "  1.317 1.564 0.83  2.724 0.825 0.939 1.41  0.959 1.418 1.32  0.693 1.496\n",
      "  1.383 1.53  0.717 1.231 0.615]\n",
      " [1.163 0.978 1.376 1.527 1.239 1.358 1.133 1.201 1.152 1.351 2.058 1.239\n",
      "  0.99  1.243 0.691 1.364 0.73  0.91  1.032 0.762 1.205 1.202 0.691 1.078\n",
      "  1.14  1.207 0.628 0.915 0.723]\n",
      " [1.221 1.029 1.847 2.121 1.868 1.44  1.355 1.64  1.464 1.724 1.239 2.179\n",
      "  1.209 1.36  0.827 1.822 0.91  0.925 1.413 0.898 1.249 1.301 0.694 1.25\n",
      "  1.255 1.407 0.694 1.142 0.575]\n",
      " [1.03  0.851 1.343 1.532 1.355 1.185 1.245 1.275 1.058 1.317 0.99  1.209\n",
      "  2.009 1.281 0.706 1.37  0.77  0.749 1.08  0.782 1.123 0.947 0.664 0.995\n",
      "  1.003 1.106 0.644 0.958 0.541]\n",
      " [1.525 1.153 1.508 1.699 1.566 1.637 1.583 1.386 1.228 1.564 1.243 1.36\n",
      "  1.281 3.282 0.787 1.563 0.786 0.798 1.18  0.857 1.695 1.123 0.722 1.122\n",
      "  1.148 1.329 0.674 1.083 0.7  ]\n",
      " [0.692 0.891 0.861 0.905 0.826 0.756 0.843 0.836 0.701 0.83  0.691 0.827\n",
      "  0.706 0.787 1.121 0.878 0.611 0.561 0.788 0.777 0.784 0.683 0.637 0.693\n",
      "  0.833 0.795 0.566 0.779 0.521]\n",
      " [1.269 1.14  2.37  2.296 2.039 1.564 1.511 1.942 1.68  2.724 1.364 1.822\n",
      "  1.37  1.563 0.878 3.233 0.93  0.961 1.43  1.024 1.376 1.344 0.737 1.621\n",
      "  1.4   1.559 0.807 1.285 0.635]\n",
      " [0.664 0.641 0.99  1.117 0.848 0.738 0.728 0.919 0.829 0.825 0.73  0.91\n",
      "  0.77  0.786 0.611 0.93  1.195 0.653 0.759 0.634 0.744 0.733 0.689 0.832\n",
      "  0.735 0.807 0.59  0.681 0.489]\n",
      " [0.816 0.664 1.075 1.195 0.855 0.984 0.823 0.993 0.863 0.939 0.91  0.925\n",
      "  0.749 0.798 0.561 0.961 0.653 1.421 0.75  0.641 0.874 0.907 0.543 0.888\n",
      "  0.808 0.943 0.481 0.605 0.468]\n",
      " [1.029 0.906 1.375 1.461 1.585 1.151 1.215 1.263 1.117 1.41  1.032 1.413\n",
      "  1.08  1.18  0.788 1.43  0.759 0.75  1.822 0.755 1.027 1.036 0.649 1.03\n",
      "  1.004 1.119 0.63  1.024 0.557]\n",
      " [0.733 1.072 0.964 0.949 0.918 0.91  0.881 0.963 0.775 0.959 0.762 0.898\n",
      "  0.782 0.857 0.777 1.024 0.634 0.641 0.755 1.69  0.853 0.754 0.621 0.821\n",
      "  0.921 0.888 0.629 0.784 0.518]\n",
      " [1.576 1.088 1.357 1.437 1.331 1.853 1.481 1.203 1.15  1.418 1.205 1.249\n",
      "  1.123 1.695 0.784 1.376 0.744 0.874 1.027 0.853 2.495 1.16  0.751 0.989\n",
      "  1.19  1.407 0.636 0.963 0.704]\n",
      " [1.139 0.873 1.418 1.573 1.292 1.493 1.145 1.136 1.197 1.32  1.202 1.301\n",
      "  0.947 1.123 0.683 1.344 0.733 0.907 1.036 0.754 1.16  2.688 0.628 0.981\n",
      "  1.086 1.275 0.561 0.879 0.582]\n",
      " [0.668 0.724 0.728 0.748 0.682 0.657 0.74  0.686 0.663 0.693 0.691 0.694\n",
      "  0.664 0.722 0.637 0.737 0.689 0.543 0.649 0.621 0.751 0.628 1.146 0.676\n",
      "  0.666 0.69  0.576 0.689 0.601]\n",
      " [0.86  0.854 1.505 1.604 1.269 1.042 1.002 1.361 1.097 1.496 1.078 1.25\n",
      "  0.995 1.122 0.693 1.621 0.832 0.888 1.03  0.821 0.989 0.981 0.676 1.974\n",
      "  1.089 1.116 0.7   0.922 0.588]\n",
      " [1.144 1.146 1.417 1.472 1.221 1.204 1.098 1.296 1.058 1.383 1.14  1.255\n",
      "  1.003 1.148 0.833 1.4   0.735 0.808 1.004 0.921 1.19  1.086 0.666 1.089\n",
      "  2.628 1.185 0.61  1.003 0.618]\n",
      " [1.338 1.056 1.8   1.716 1.408 1.722 1.31  1.381 1.313 1.53  1.207 1.407\n",
      "  1.106 1.329 0.795 1.559 0.807 0.943 1.119 0.888 1.407 1.275 0.69  1.116\n",
      "  1.185 2.579 0.606 0.924 0.572]\n",
      " [0.525 0.631 0.748 0.734 0.739 0.563 0.655 0.74  0.66  0.717 0.628 0.694\n",
      "  0.644 0.674 0.566 0.807 0.59  0.481 0.63  0.629 0.636 0.561 0.576 0.7\n",
      "  0.61  0.606 1.194 0.662 0.51 ]\n",
      " [0.908 1.025 1.216 1.362 1.226 1.017 1.065 1.06  0.994 1.231 0.915 1.142\n",
      "  0.958 1.083 0.779 1.285 0.681 0.605 1.024 0.784 0.963 0.879 0.689 0.922\n",
      "  1.003 0.924 0.662 3.14  0.709]\n",
      " [0.635 0.645 0.584 0.603 0.613 0.621 0.686 0.518 0.574 0.615 0.723 0.575\n",
      "  0.541 0.7   0.521 0.635 0.489 0.468 0.557 0.518 0.704 0.582 0.601 0.588\n",
      "  0.618 0.572 0.51  0.709 1.406]]\n"
     ]
    }
   ],
   "source": [
    "#compute asset returns\n",
    "arStockPrices = np.asarray(StockData)\n",
    "[Rows, Cols]=arStockPrices.shape\n",
    "arReturns = StockReturnsComputing(arStockPrices, Rows, Cols)\n",
    "\n",
    "\n",
    "#compute mean returns and variance covariance matrix of returns\n",
    "meanReturns = np.mean(arReturns, axis = 0)\n",
    "covReturns = np.cov(arReturns, rowvar=False)\n",
    " \n",
    "#set precision for printing results\n",
    "np.set_printoptions(precision=3, suppress = True)\n",
    "\n",
    "#display mean returns and variance-covariance matrix of returns\n",
    "print('Mean returns of assets in k-portfolio 1\\n', meanReturns)\n",
    "print('Variance-Covariance matrix of returns\\n', covReturns)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "b1btTONEdCU4",
    "outputId": "71544f9d-b695-4468-e573-e85135692c1f"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([268510.,      0.,      0.,      0.,      0.,  67170.,      0.,\n",
       "            0.,      0.,      0., 328490.,      0.,      0.,      0.,\n",
       "            0.,      0.,      0.,      0.,      0.,      0.,      0.,\n",
       "        80330.,      0.,      0., 249920.,   5570.,      0.,      0.,\n",
       "            0.])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from pypfopt.efficient_frontier import EfficientFrontier\n",
    "\n",
    "ef_mean = EfficientFrontier(meanReturns, covReturns, weight_bounds=(0, 0.5))\n",
    "raw_weights_mean = ef_mean.max_sharpe()\n",
    "cleaned_weights_mean = ef_mean.clean_weights()\n",
    "mvo_weights = np.array([1000000 * cleaned_weights_mean[i] for i in range(29)])\n",
    "mvo_weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 191
    },
    "id": "N6tTAjAvgFtO",
    "outputId": "9f16c93f-36fb-4e19-f8fb-5c8428e55351"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-a084de9e-1f08-4157-b2ee-a181de056551\">\n",
       "    <div class=\"colab-df-container\">\n",
       "      <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>AAPL</th>\n",
       "      <th>AMGN</th>\n",
       "      <th>AXP</th>\n",
       "      <th>BA</th>\n",
       "      <th>CAT</th>\n",
       "      <th>CRM</th>\n",
       "      <th>CSCO</th>\n",
       "      <th>CVX</th>\n",
       "      <th>DIS</th>\n",
       "      <th>GS</th>\n",
       "      <th>...</th>\n",
       "      <th>MRK</th>\n",
       "      <th>MSFT</th>\n",
       "      <th>NKE</th>\n",
       "      <th>PG</th>\n",
       "      <th>TRV</th>\n",
       "      <th>UNH</th>\n",
       "      <th>V</th>\n",
       "      <th>VZ</th>\n",
       "      <th>WBA</th>\n",
       "      <th>WMT</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2021-10-25</th>\n",
       "      <td>147.341995</td>\n",
       "      <td>197.852112</td>\n",
       "      <td>179.354034</td>\n",
       "      <td>212.869995</td>\n",
       "      <td>196.628174</td>\n",
       "      <td>293.920013</td>\n",
       "      <td>53.038136</td>\n",
       "      <td>107.683975</td>\n",
       "      <td>172.009995</td>\n",
       "      <td>399.109955</td>\n",
       "      <td>...</td>\n",
       "      <td>78.373215</td>\n",
       "      <td>303.950775</td>\n",
       "      <td>161.721741</td>\n",
       "      <td>136.581009</td>\n",
       "      <td>156.46492</td>\n",
       "      <td>440.793488</td>\n",
       "      <td>231.263245</td>\n",
       "      <td>49.079575</td>\n",
       "      <td>45.984653</td>\n",
       "      <td>147.145218</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1 rows × 29 columns</p>\n",
       "</div>\n",
       "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-a084de9e-1f08-4157-b2ee-a181de056551')\"\n",
       "              title=\"Convert this dataframe to an interactive table.\"\n",
       "              style=\"display:none;\">\n",
       "        \n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
       "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
       "  </svg>\n",
       "      </button>\n",
       "      \n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      flex-wrap:wrap;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "      <script>\n",
       "        const buttonEl =\n",
       "          document.querySelector('#df-a084de9e-1f08-4157-b2ee-a181de056551 button.colab-df-convert');\n",
       "        buttonEl.style.display =\n",
       "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "        async function convertToInteractive(key) {\n",
       "          const element = document.querySelector('#df-a084de9e-1f08-4157-b2ee-a181de056551');\n",
       "          const dataTable =\n",
       "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                     [key], {});\n",
       "          if (!dataTable) return;\n",
       "\n",
       "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "            + ' to learn more about interactive tables.';\n",
       "          element.innerHTML = '';\n",
       "          dataTable['output_type'] = 'display_data';\n",
       "          await google.colab.output.renderOutput(dataTable, element);\n",
       "          const docLink = document.createElement('div');\n",
       "          docLink.innerHTML = docLinkHtml;\n",
       "          element.appendChild(docLink);\n",
       "        }\n",
       "      </script>\n",
       "    </div>\n",
       "  </div>\n",
       "  "
      ],
      "text/plain": [
       "                  AAPL        AMGN         AXP          BA         CAT  \\\n",
       "2021-10-25  147.341995  197.852112  179.354034  212.869995  196.628174   \n",
       "\n",
       "                   CRM       CSCO         CVX         DIS          GS  ...  \\\n",
       "2021-10-25  293.920013  53.038136  107.683975  172.009995  399.109955  ...   \n",
       "\n",
       "                  MRK        MSFT         NKE          PG        TRV  \\\n",
       "2021-10-25  78.373215  303.950775  161.721741  136.581009  156.46492   \n",
       "\n",
       "                   UNH           V         VZ        WBA         WMT  \n",
       "2021-10-25  440.793488  231.263245  49.079575  45.984653  147.145218  \n",
       "\n",
       "[1 rows x 29 columns]"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "StockData.tail(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "F38NJRJJgOmj",
    "outputId": "5b0ef1d6-61d7-4525-fe5a-1cba0d9a2836"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1822.359,    0.   ,    0.   ,    0.   ,    0.   ,  228.532,\n",
       "          0.   ,    0.   ,    0.   ,    0.   ,  917.405,    0.   ,\n",
       "          0.   ,    0.   ,    0.   ,    0.   ,    0.   ,    0.   ,\n",
       "          0.   ,    0.   ,    0.   ,  496.717,    0.   ,    0.   ,\n",
       "        566.978,   24.085,    0.   ,    0.   ,    0.   ])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "LastPrice = np.array([1/p for p in StockData.tail(1).to_numpy()[0]])\n",
    "Initial_Portfolio = np.multiply(mvo_weights, LastPrice)\n",
    "Initial_Portfolio"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 424
    },
    "id": "ZAd1iXqZhQ6X",
    "outputId": "0528f221-b650-4847-d582-173b1dc2f8f4"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "  <div id=\"df-719395e3-be47-42dc-b6e5-c14813b26bcf\">\n",
       "    <div class=\"colab-df-container\">\n",
       "      <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Mean Var</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2021-10-26</th>\n",
       "      <td>1.002272e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-10-27</th>\n",
       "      <td>1.002461e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-10-28</th>\n",
       "      <td>1.011236e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-10-29</th>\n",
       "      <td>1.010909e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-11-01</th>\n",
       "      <td>1.001450e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-21</th>\n",
       "      <td>9.195315e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-22</th>\n",
       "      <td>9.194654e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-23</th>\n",
       "      <td>9.249119e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-24</th>\n",
       "      <td>9.120101e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-27</th>\n",
       "      <td>9.135293e+05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>336 rows × 1 columns</p>\n",
       "</div>\n",
       "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-719395e3-be47-42dc-b6e5-c14813b26bcf')\"\n",
       "              title=\"Convert this dataframe to an interactive table.\"\n",
       "              style=\"display:none;\">\n",
       "        \n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
       "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
       "  </svg>\n",
       "      </button>\n",
       "      \n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      flex-wrap:wrap;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "      <script>\n",
       "        const buttonEl =\n",
       "          document.querySelector('#df-719395e3-be47-42dc-b6e5-c14813b26bcf button.colab-df-convert');\n",
       "        buttonEl.style.display =\n",
       "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "        async function convertToInteractive(key) {\n",
       "          const element = document.querySelector('#df-719395e3-be47-42dc-b6e5-c14813b26bcf');\n",
       "          const dataTable =\n",
       "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                     [key], {});\n",
       "          if (!dataTable) return;\n",
       "\n",
       "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "            + ' to learn more about interactive tables.';\n",
       "          element.innerHTML = '';\n",
       "          dataTable['output_type'] = 'display_data';\n",
       "          await google.colab.output.renderOutput(dataTable, element);\n",
       "          const docLink = document.createElement('div');\n",
       "          docLink.innerHTML = docLinkHtml;\n",
       "          element.appendChild(docLink);\n",
       "        }\n",
       "      </script>\n",
       "    </div>\n",
       "  </div>\n",
       "  "
      ],
      "text/plain": [
       "                Mean Var\n",
       "2021-10-26  1.002272e+06\n",
       "2021-10-27  1.002461e+06\n",
       "2021-10-28  1.011236e+06\n",
       "2021-10-29  1.010909e+06\n",
       "2021-11-01  1.001450e+06\n",
       "...                  ...\n",
       "2023-02-21  9.195315e+05\n",
       "2023-02-22  9.194654e+05\n",
       "2023-02-23  9.249119e+05\n",
       "2023-02-24  9.120101e+05\n",
       "2023-02-27  9.135293e+05\n",
       "\n",
       "[336 rows x 1 columns]"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Portfolio_Assets = TradeData @ Initial_Portfolio\n",
    "MVO_result = pd.DataFrame(Portfolio_Assets, columns=[\"Mean Var\"])\n",
    "MVO_result"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "W6vvNSC6h1jZ"
   },
   "source": [
    "<a id='6'></a>\n",
    "# Part 7: Backtesting Results\n",
    "Backtesting plays a key role in evaluating the performance of a trading strategy. Automated backtesting tool is preferred because it reduces the human error. We usually use the Quantopian pyfolio package to backtest our trading strategies. It is easy to use and consists of various individual plots that provide a comprehensive image of the performance of a trading strategy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "KeDeGAc9VrEg",
    "outputId": "11fb5805-7b2a-44c6-ccff-5238114632aa"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==============Get Baseline Stats===========\n",
      "\r[*********************100%***********************]  1 of 1 completed\n",
      "Shape of DataFrame:  (354, 8)\n",
      "Annual return         -0.034876\n",
      "Cumulative returns    -0.048644\n",
      "Annual volatility      0.181612\n",
      "Sharpe ratio          -0.105351\n",
      "Calmar ratio          -0.158953\n",
      "Stability              0.280983\n",
      "Max drawdown          -0.219408\n",
      "Omega ratio            0.982546\n",
      "Sortino ratio         -0.146974\n",
      "Skew                        NaN\n",
      "Kurtosis                    NaN\n",
      "Tail ratio             0.970602\n",
      "Daily value at risk   -0.022957\n",
      "dtype: float64\n",
      "result:                       a2c          ddpg           td3           ppo  \\\n",
      "2021-10-26  1.051812e+06  1.018527e+06  1.056433e+06  1.011904e+06   \n",
      "2021-10-27  1.043241e+06  1.014168e+06  1.047235e+06  1.009184e+06   \n",
      "2021-10-28  1.052310e+06  1.022907e+06  1.054719e+06  1.015529e+06   \n",
      "2021-10-29  1.055662e+06  1.027023e+06  1.057137e+06  1.014713e+06   \n",
      "2021-11-01  1.057257e+06  1.032846e+06  1.060964e+06  1.018755e+06   \n",
      "...                  ...           ...           ...           ...   \n",
      "2023-02-21  1.041167e+06  9.991659e+05  1.026943e+06  9.549536e+05   \n",
      "2023-02-22  1.037622e+06  9.960402e+05  1.022617e+06  9.520512e+05   \n",
      "2023-02-23  1.038932e+06  9.987703e+05  1.026913e+06  9.537116e+05   \n",
      "2023-02-24  1.028207e+06  9.827645e+05  1.016881e+06  9.479264e+05   \n",
      "2023-02-27  1.030205e+06  9.877202e+05  1.018708e+06  9.499940e+05   \n",
      "\n",
      "                     sac      mean var           dji  \n",
      "2021-10-26  1.032124e+06  1.002272e+06  1.041671e+06  \n",
      "2021-10-27  1.025997e+06  1.002461e+06  1.033916e+06  \n",
      "2021-10-28  1.032015e+06  1.011236e+06  1.040902e+06  \n",
      "2021-10-29  1.032366e+06  1.010909e+06  1.043497e+06  \n",
      "2021-11-01  1.035971e+06  1.001450e+06  1.046244e+06  \n",
      "...                  ...           ...           ...  \n",
      "2023-02-21  9.249436e+05  9.195315e+05  9.651327e+05  \n",
      "2023-02-22  9.238542e+05  9.194654e+05  9.626710e+05  \n",
      "2023-02-23  9.251586e+05  9.249119e+05  9.658412e+05  \n",
      "2023-02-24  9.190799e+05  9.120101e+05  9.560240e+05  \n",
      "2023-02-27  9.207091e+05  9.135293e+05  9.581264e+05  \n",
      "\n",
      "[336 rows x 7 columns]\n"
     ]
    }
   ],
   "source": [
    "df_result_a2c = df_account_value_a2c.set_index(df_account_value_a2c.columns[0])\n",
    "df_result_ddpg = df_account_value_ddpg.set_index(df_account_value_ddpg.columns[0])\n",
    "df_result_td3 = df_account_value_td3.set_index(df_account_value_td3.columns[0])\n",
    "df_result_ppo = df_account_value_ppo.set_index(df_account_value_ppo.columns[0])\n",
    "df_result_sac = df_account_value_sac.set_index(df_account_value_sac.columns[0])\n",
    "df_account_value_a2c.to_csv(\"df_account_value_a2c.csv\")\n",
    "#baseline stats\n",
    "print(\"==============Get Baseline Stats===========\")\n",
    "df_dji_ = get_baseline(\n",
    "        ticker=\"^DJI\", \n",
    "        start = TRADE_START_DATE,\n",
    "        end = TRADE_END_DATE)\n",
    "stats = backtest_stats(df_dji_, value_col_name = 'close')\n",
    "df_dji = pd.DataFrame()\n",
    "df_dji['date'] = df_account_value_a2c['date']\n",
    "df_dji['account_value'] = df_dji_['close'] / df_dji_['close'][0] * env_kwargs[\"initial_amount\"]\n",
    "df_dji.to_csv(\"df_dji.csv\")\n",
    "df_dji = df_dji.set_index(df_dji.columns[0])\n",
    "df_dji.to_csv(\"df_dji+.csv\")\n",
    "\n",
    "result = pd.merge(df_result_a2c, df_result_ddpg, left_index=True, right_index=True, suffixes=('_a2c', '_ddpg'))\n",
    "result = pd.merge(result, df_result_td3, left_index=True, right_index=True, suffixes=('', '_td3'))\n",
    "result = pd.merge(result, df_result_ppo, left_index=True, right_index=True, suffixes=('', '_ppo'))\n",
    "result = pd.merge(result, df_result_sac, left_index=True, right_index=True, suffixes=('', '_sac'))\n",
    "result = pd.merge(result, MVO_result, left_index=True, right_index=True, suffixes=('', '_mvo'))\n",
    "result = pd.merge(result, df_dji, left_index=True, right_index=True, suffixes=('', '_dji'))\n",
    "result.columns = ['a2c', 'ddpg', 'td3', 'ppo', 'sac', 'mean var', 'dji']\n",
    "\n",
    "print(\"result: \", result)\n",
    "result.to_csv(\"result.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 348
    },
    "id": "6xRfrqK4RVfq",
    "outputId": "42a2502d-7447-40ef-e897-1af949fda9e0"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1080x360 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1080x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "plt.rcParams[\"figure.figsize\"] = (15,5)\n",
    "plt.figure();\n",
    "result.plot();"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [
    "HMNR5nHjh1iz",
    "uijiWgkuh1jB",
    "MRiOtrywfAo1",
    "_gDkU-j-fCmZ",
    "3Zpv4S0-fDBv"
   ],
   "provenance": []
  },
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5 (default, Sep  4 2020, 02:22:02) \n[Clang 10.0.0 ]"
  },
  "vscode": {
   "interpreter": {
    "hash": "54cefccbf0f07c9750f12aa115c023dfa5ed4acecf9e7ad3bc9391869be60d0c"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
